Reserve中常见的加密算法
在做逆向的时候,我们难免会遇到各种各样的加密算法
这次来介绍几种常见的加密算法
RC4
RC4加密算法简介
RC4是一种对称的加密算法,所谓的对称加密算法是指加密和解密使用相同密钥的加密算法,数据发送方利用密钥将明文经过特殊加密算法处理后,使其变成复杂的加密密文发送出去,接收方收到密文后,若想解读原文,则需要使用加密用过的密钥以及相同的加密算法对明文进行解密,才能使其恢复成可读的明文。
RC4算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),生成的密钥流的长度和铭文的长度是对应的。在现在技术支持的前提下,当密钥长度为128比特是,用暴力法搜索密钥可能已经不太可行,所以能够预见RC4的密钥范围仍然能够在今后相当长的时间里低于暴力搜索哟密钥的攻击。实际上,现在也没有找到对于128bit密钥长度的RC4加密算法的有效的攻击方法。
RC4主要包括了初始化算法(KSA)和加密算法两大部分。
加密(解密)原理
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。
逆向特征
有很多取模操作
有很多256
有多个次数为256的循环
最后操作为异或
代码通常的结构
初始化S和T:
1 | for i=0 to do |
初始排列S:
1 | j=0; |
生成密钥流,利用密钥流和明文进行加密:
1 | i,j=0; |
例题
首先我们查找字符串交叉引用到main函数
然后按Tab或F5进行反编译
然后发现反编译失败,根据报错窗口跳转到对应地址处
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
发现了花指令
1 | .text:00401055 57 push edi ; ArgList |
将其修改为(先d转换数据,然后使用ctrl+alt+k使用keypatch将多余的那个字节修改成0x90即可,然后再按C转换为指令)(注:ida上方菜单栏的小绿点为自动反汇编功能,点击取消自动反汇编)
1 | .text:00401058 |
即可反编译
加密分析
输入flag以及长度计算
1 | memset(flag, 0, sizeof(flag)); |
关键加密
1 | do |
解密脚本:
1 |
|
得到flag:flag{c5e0f5f6-f79e-5b9b-988f-28f046117802}
TEA
在安全学领域,TEA(Tiny Encryption Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。
TEA系列算法在目前较为基础的reserve题目中会较常出现,但是随着CTF的参赛人员质量的提高,以往一些在逆向较为常见的算法
也逐渐运用到pwn里面形成了新的题型RePwn,所以做为pwn手,对于逆向的学习是很有必要的。
目前,tea算法总共有3大类(魔改除外),tea,xtea,xxtea。
TEA算法的原理简单阐述就是每次加密2个元素,加密方式通过利用key schedule constant(关键时刻表常数)以及4位密钥
进行指定轮数的加减、位移以及异或操作,通常的轮数为32轮。
例题
拖入IDA中进行分析,同样可以通过函数名搜索或者字符串查找来定位到我们的main函数
发现处理我们的输入数据的就只有enc函数
反编译之后根据特征分析可以得知就是TEA加密算法
并且魔改过
delta的值被修改为了0x73637466
在最后赋值回去前添加了异或
异或的值是delta的值
根据这个加密算法,我们先写出正向
1 |
|
最后我们根据加密写出解密即可
1 |
|
得到flag:c5e0f5f6f79e5b9b988f8f04611a7802
Base64
…