前段时间遇到一个对被TEA加密的文件进行解密的题目。题目给出了一个用于加密的exe文件、一个被加密的txt文件。要求还原出被加密文件的明文内容。
网络上有很多使用C或C++对TEA进行解密的代码,这里不再赘述。那么,在没有互联网的情况下,需要一定的知识积累。那么在不了解TEA加密算法、没有编程IDE的情况下,是否可以快速准确地解密文件呢?答案是:可以的。下面是我自己逆向的过程(包括自己疏忽的部分)。
TEA加密
TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
程序功能分析
加密的核心伪代码如下:2个32位的dword进行32轮的加减异或运算。
加密密钥如下:
原始密钥为:WK$@%xUdW3oHTPLv
后该16字节(128位)的密钥,逐位与68(0x44)异或:
得到真正的加密密钥: [0x130f6004, 0x613c1120,0x13772b0c, 0x10140832]
后面就是明文块和加密密钥的加减、异或运算了。
修改参数、运算符、*代码顺序
经过对程序功能的分析,我们需要明确修改的地方有哪些、需要修改的值应设置为多少。
【分析】
首先,可以看出:
一、这个加密为对称加密,可以从加密算法轻松的得到解密算法;
二、v4(sum)由0逐步增加 0x9e3779b9(等价于 减 0x61c88647),共循环32次;
三、v6(left)每次循环 + 异或值;
四、v5(right)每次循环 + 异或值;
五、第一次逆向的时候,没有看出来,后面会补充。
针对上面的分析我们做出解决方案并给出操作:
【解决方案】
一、根据原加密算法,加变减、减变加、终点变起点、异或再异或的原则进行逆运算;
二、v4(sum)由0x9e3779b9*32逐步减少 0x9e3779b9(等价于 加 0x61c88647),共循环32次;(将v4=0改为 v4=0xC6EF3720、每次循环的add更改为sub)![](https://i-blog.csdnimg.cn/direct/8851b0dbcc1c4d82b0583980dfe6bb9e.png)
三、v6(left)每次循环 - 异或值;
四、v5(right)每次循环 - 异或值;
得到的伪代码如下:
【修改后】
对比下【修改前】
尝试解密……失败!返回查看代码:
增加分析:
五、发现加密是,先左后右,那解密是应该先右后左
解决方案:
五、在原来修改的基础上,尝试更改指令执行顺序。
由于IDA不像编写程序一样可以直接调整语句的顺序,那么可以尝试以修改机器码的方式进行顺序的修改。由于只是修改顺序,而不是增加语句,这样使得此次逆向得以实现。
分析指令,识别对应的语句:
整理好新的顺序:
改变顺序
8B 45 FC C1 E0 04 89 C2 8B 45 FC C1 E8 05 31 C2
8B 45 FC 8D 0C 02 8B 45 F4 C1 E8 0B 89 C0 83 E0
03 48 8D 14 85 00 00 00 00 48 8B 45 28 48 01 D0
8B 10 8B 45 F4 01 D0 31 C8 29 45 F8 8B 55 FC 8B
4D F8 89 D0 89 CB 31 C3 8B 45 EC 29 45 F4 8B 45
F8 C1 E0 04 89 C2 8B 45 F8 C1 E8 05 31 C2 8B 45
F8 8D 0C 02 8B 45 F4 83 E0 03 48 8D 14 85 00 00
00 00 48 8B 45 28 48 01 D0 8B 10 8B 45 F4 01 D0
31 C8 29 45 FC
替换到原来的文件中(offset:1580~1604):
再次patch……
结果
把原文件拖到新打包的exe文件中解密
完成!