yonkies_keygenme_3 writeup 及代码复用(编译/链接进代码)的技巧
字数 2095 2025-09-01 11:26:17
XTEA变型算法逆向分析与Keygen实现
1. 题目概述
这是一个基于XTEA变型算法的keygenme逆向分析题目,主要特点包括:
- 使用变型的XTEA加密算法
- 注册文件为44字节(11个DWORD)
- 包含CRC32校验
- 特殊的密钥与密文关系trick
2. 验证逻辑分析
2.1 文件结构
注册文件必须是44个字节,由11个DWORD类型数据组成,结构如下:
| 偏移 | 内容 |
|---|---|
| 0-3 | XTEA key[1] |
| 4-7 | XTEA key[2] |
| 8-11 | XTEA key[3] |
| 12-15 | XTEA key[0] (同时也是"sign"的密文) |
| 16-19 | Serial Number密文 |
| 20-23 | Features密文 |
| 24-27 | 用户名CRC32校验值的密文 |
| 28-31 | 用户名密文part1 |
| 32-35 | 用户名密文part2 |
| 36-39 | 用户名密文part3 |
| 40-43 | 用户名密文part4 |
2.2 验证流程
- 读取11个DWORD数据到内存
- 重排XTEA算法的KEY顺序
- 第一轮XTEA解密:
- 解密dword_418240[3]和dword_418240[4]
- 检查dword_418240[3]的明文必须为"sign"(0x7369676E)
- dword_418240[4]解密结果为Serial Number
- 第二轮XTEA解密:
- 解密dword_418240[5]和dword_418240[6]
- dword_418240[5]解密后对应Feature
- dword_418240[6]解密后是用户名的CRC32校验值
- 第三轮XTEA解密:
- 解密dword_418240[7]到dword_418240[10]得到用户名
- 用户名必须用空格补足16字节
- 计算用户名的CRC32值并与解密得到的校验值比对
2.3 关键trick
dword_418240[3]既是XTEA算法的key[0],又是"sign"字符串的密文。这意味着:
- "sign"加密后的结果必须等于key[0]
- 这是一个自引用关系,增加了keygen实现的难度
3. XTEA算法分析
3.1 标准XTEA算法
标准XTEA加密过程:
- 初始化:
- 64位明文分为两个32位字V0和V1
- 128位密钥分为四个32位子密钥K[0]-K[3]
- 64轮加密:
- 每轮对V0和V1进行变换
- 使用delta常数0x9E3779B9
- 输出:
- V0和V1连接形成64位密文
3.2 题目中的变型
- 使用不同的常数:0x25E1B381和0xBADF00D
- 循环次数为0x45次
- 密钥选择方式不同
- 密文和明文的DWORD顺序可能与标准相反
4. Keygen实现步骤
4.1 实现XTEA加解密函数
根据IDA伪代码实现变型的XTEA加解密函数,注意:
- 加解密是逆过程
- 注意DWORD顺序
- 使用题目中的常数和循环次数
4.2 解决关键trick
暴力查找满足条件的KEY组合:
- 随机选择KEY[1]、KEY[2]、KEY[3]
- 暴力枚举KEY[0]的可能值
- 检查"sign"加密结果是否等于KEY[0]
- 如果无解,重新随机KEY[1]-KEY[3]再次尝试
优化技巧:
- 多线程并行暴力(如根据线程号设置KEY[0]的高位)
- 避免KEY或明文中出现大量0x00字节
- 一轮暴力时间约6-7分钟(16线程)
4.3 CRC32实现
复用目标程序的CRC32代码:
- 从目标程序中提取CRC32计算代码
- 封装成函数,添加参数和返回值处理
- 编译为.o文件并链接到keygen中
4.4 完整keygen流程
- 用户输入:
- Serial Number
- Features
- 用户名(自动补空格至16字节)
- 计算用户名的CRC32值
- 暴力查找满足条件的XTEA密钥:
- "sign"加密结果等于KEY[0]
- 加密Serial Number、Features和CRC32值
- 加密用户名(分4部分)
- 输出11个DWORD的注册文件
5. 代码复用技巧
5.1 直接编译链接
- 将复用代码编译为.o文件
- 直接链接到keygen程序中
- 适用于C/C++实现的keygen
5.2 动态链接库
- 将复用代码编译为.so/.dll
- 适用于Python等脚本语言实现的keygen
- 需要中间层进行转换
5.3 内存中复用
- 使用angr等工具加载目标程序
- 直接在内存中调用目标函数
- 可实现跨平台复用
6. 总结
本题的关键点:
- 识别XTEA变型算法及其参数
- 分析注册文件结构和验证流程
- 解决密钥自引用的trick
- 实现高效的暴力破解策略
- 复用目标程序的算法实现
通过这个案例,我们学习了:
- 复杂加密算法的逆向分析方法
- 特殊限制条件下的keygen实现技巧
- 不同场景下的代码复用策略
- 暴力破解的优化思路