29、加密算法逆向(二):AES/DES对称加密算法逆向分析
对称加密,说白了就是加密和解密用同一把钥匙。你在逆向中碰到它,十有八九是AES,偶尔还能见到DES这种老古董。我个人习惯是,先看常量,再找S盒,最后定位密钥扩展——这套组合拳打下来,基本八九不离十。
29.1 对称加密的“指纹”:如何一眼认出AES/DES
逆向分析的第一步,不是读代码,而是找特征。AES和DES都有非常明显的“指纹”,就像人的DNA一样独特。
AES的典型特征
- S盒常量:AES的S盒是一个256字节的固定数组。你在二进制里看到一串类似
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5...的数据,基本就是AES没跑了。 - 轮常数Rcon:密钥扩展用的轮常数,通常是
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36。 - 固定操作模式:AES核心是4x4字节矩阵的轮函数,包含SubBytes、ShiftRows、MixColumns、AddRoundKey。逆向时你会看到大量的异或、查表、循环移位操作。
DES的典型特征
- 初始置换IP表和逆初始置换IP⁻¹表:这两个表各64字节,是DES独有的。
- 8个S盒:每个S盒是4x16的矩阵,共512字节。这是DES最核心的部分。
- 置换表P:32字节的置换表。
- 密钥置换PC-1和PC-2:各56字节和48字节。
实战技巧:我在分析一个恶意软件样本时,看到二进制里有一串 0x63, 0x7C, 0x77...,立刻断定它用了AES。然后我直接定位到S盒地址,往上翻几行就找到了密钥扩展函数。整个过程不到5分钟。
29.2 实战:从二进制中定位AES核心函数
假设你手头有一个二进制文件,怀疑它用了AES加密。怎么快速定位?我一般按这个流程来:
- 搜索S盒常量:用十六进制编辑器或IDA搜索
63 7C 77 7B F2 6B 6F C5。找到后,记下地址。 - 交叉引用:在IDA中,对S盒地址做交叉引用(X键),看看哪些函数引用了它。通常引用S盒的函数就是AES的核心轮函数。
- 分析轮函数:进入该函数,你会看到类似下面的结构:
// 伪代码示例:AES轮函数
void aes_round(uint8_t state[16], uint8_t round_key[16]) {
// SubBytes:查S盒
for (int i = 0; i < 16; i++) {
state[i] = sbox[state[i]];
}
// ShiftRows:行移位
// MixColumns:列混合(通常用查表优化)
// AddRoundKey:异或轮密钥
for (int i = 0; i < 16; i++) {
state[i] ^= round_key[i];
}
}
提示:很多编译器会把MixColumns优化成查表操作,你会看到4个256字节的查找表(T表)。这也是AES的一个强特征。如果你看到4个连续的256字节表,基本可以确定是AES。
29.3 密钥提取:从内存中捞出那把“钥匙”
找到加密函数后,下一步就是提取密钥。密钥通常以两种形式存在:
- 硬编码密钥:直接写在代码里。在IDA中搜索16字节(AES-128)或32字节(AES-256)的常量数组。
- 动态生成密钥:通过密钥派生函数(如PBKDF2)生成。你需要找到密钥生成的入口点,然后动态调试,在内存中dump出密钥。
我曾经遇到一个情况:密钥是硬编码的,但被拆成了4个4字节的整数,分散在不同的函数里。我通过交叉引用,发现它们最终被拼接到一个16字节的数组中。嗯,这种小把戏,看穿了就不值一提。
29.4 DES逆向:虽然老了,但还在用
DES现在用得少了,但在一些老旧的嵌入式设备或金融系统中还能见到。逆向DES比AES稍微麻烦一点,因为它的结构更复杂。
定位DES的关键是找到那8个S盒。每个S盒是4行16列,共64字节。8个S盒就是512字节。在二进制中搜索这些S盒的常量,就能定位到DES函数。
// 伪代码示例:DES的S盒查找
// S盒1
uint8_t sbox1[4][16] = {
{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}
};
注意:DES的密钥长度只有56位,这在今天已经很不安全了。如果你在逆向中看到DES,大概率是历史遗留代码。但作为逆向工程师,你还是要能识别它。
29.5 知识体系:对称加密逆向的核心逻辑
下面这张图是我自己总结的对称加密逆向分析流程,你照着这个思路走,基本不会迷路。
29.6 避坑指南:我踩过的那些坑
做逆向分析,尤其是加密算法这块,坑特别多。我把自己踩过的坑总结一下,你遇到了能少走弯路。
我曾经... 在一个固件里找到了AES的S盒,兴冲冲地开始分析,结果发现它根本不是AES,而是一个自定义的加密算法,只是借用了AES的S盒。所以,找到S盒只是第一步,你还要确认它是否真的用了标准的AES轮函数。
另一个坑:有些开发者会把密钥拆成多段,分散在不同的函数中,甚至用异或、加减等操作进行混淆。我建议你动态调试,在加密函数入口处下断点,直接dump内存中的密钥。这比静态分析要靠谱得多。
29.7 总结
对称加密的逆向,说白了就是三步:找特征、定位函数、提取密钥。AES看S盒和轮常数,DES看8个S盒和置换表。掌握了这些,你就能在二进制中快速识别出它们。
我个人觉得,逆向加密算法最关键的还是经验。你见得多了,一眼就能看出门道。多练练,你也能做到。