xnuca-Strange Interpreter-浅谈逆向小技巧
字数 1244 2025-08-18 11:35:40
LLVM混淆逆向分析与调试技巧详解
一、题目背景与初步分析
题目"Strange Interpreter"是一个经过LLVM混淆的64位Linux动态链接程序,使用Obfuscator-LLVM 4.0.1编译。主要特点包括:
- 程序使用了控制流平坦化(Control Flow Flattening)混淆技术
- 存在大量花指令干扰静态分析
- 关键字符串显示flag长度为32字节
- 程序中包含明显的校验数据区域:
byte_613050和ds:dword_6130D0
二、逆向分析策略
1. 关键数据定位
逆向时应重点关注以下数据区域:
ds:dword_6130D0:存储经过加密变换后的输入数据byte_613050:最终校验数据ds:index:用作数组索引的计数器
2. IDA使用技巧
- 利用CFG(控制流图)视图理解程序结构
- 识别基本块之间的跳转关系
- 重命名关键变量和函数提高可读性
三、动态调试技巧
1. 高效调试方法
-
断点策略:
- 在每个分支的最后一个基本块下断点
- 使用F9直接运行到断点处,避免单步跟踪无用代码
-
观察点设置:
- 监控
ds:dword_6130D0区域的变化 - 跟踪
ds:index的变化规律
- 监控
-
快速跳过重复代码:
- 使用F4运行到光标位置
- 识别并跳过大量重复操作(如index增减)
2. 关键流程分析
-
输入处理阶段:
- 程序将输入逐个字符存入
ds:dword_6130D0 - 使用
ds:index作为索引计数器 - 循环直到处理完32字节(0x20)
- 程序将输入逐个字符存入
-
数据处理阶段:
- 将特定字符数据复制到
ds:dword_6130D0偏移index*4位置 - 后续将另一块数据复制到偏移
0x1d0*4处
- 将特定字符数据复制到
-
加密变换阶段:
- 在地址
0x411A09处发现关键XOR操作 - 输入数据与初始化数据进行异或
- 只有前16字节(0x10)发生变化
- 在地址
四、解密算法还原
1. 第一部分解密
前16字节的异或操作:
dic = '012345abcdefghijklmnopqrstuvwxyz'
xor1 = [0x68,0x1C,0x7C,0x66,0x77,0x74,0x1A,0x57,0x06,0x53,0x52,0x53,0x02,0x5D,0x0C,0x5D]
flag1 = ""
for i in range(16):
flag1 += chr(xor1[i] ^ ord(dic[i]))
2. 第二部分解密
后16字节的异或操作:
xor2 = [0x04,0x74,0x46,0x0E,0x49,0x06,0x3D,0x72,0x73,0x76,0x27,0x74,0x25,0x78,0x79,0x30]
xor3 = [0x68,0x1C,0x7C,0x66,0x77,0x74,0x1A,0x57,0x06,0x53,0x52,0x53,0x02,0x5D,0x0C,0x5D]
flag2 = ""
for i in range(16):
j = i + 16
flag2 += chr(xor2[i] ^ ord(dic[j]) ^ xor3[i] ^ ord(dic[i]))
3. 完整flag组合
print(flag1 + flag2)
五、Obfuscator-LLVM编译环境搭建
1. 安装步骤
$ git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make -j7
2. 混淆选项使用
编译时添加混淆参数:
$ path_to_the/build/bin/clang test.c -o test -mllvm -sub -mllvm -fla
常用混淆选项:
-sub:指令替换(Substitution)-fla:控制流平坦化(Control Flow Flattening)
六、逆向工程方法论总结
-
目的导向分析:
- 先形成假设再验证,而非盲目跟踪
- 关注数据流而非控制流
-
效率优化:
- 合理使用断点减少无用调试
- 识别并跳过重复代码段
-
工具利用:
- 充分发挥IDA的CFG视图优势
- 善用数据监控功能
-
混淆对抗:
- 识别控制流平坦化特征
- 关注关键数据变换点而非全部指令
七、附件说明
原始分析使用的IDB文件包含以下重命名和注释:
- 关键变量重命名(如index)
- 重要函数标注
- 数据区域说明
- 关键算法位置标记
通过这种系统化的分析方法,即使面对LLVM混淆的复杂程序,也能有效提取关键逻辑并完成逆向工程任务。