cython逆向之CTF实战(1)
字数 1401 2025-08-22 12:23:12
Cython逆向分析实战:CTF题目rand0m解析
前言
随着Cython在CTF题目中的应用越来越广泛,掌握Cython逆向分析技能变得尤为重要。本文将以CISCN比赛中的"rand0m"题目为例,详细讲解如何逆向分析Cython编译的.pyd文件。
环境准备
-
Python版本匹配:
- Cython编译的.pyd文件对Python版本有严格要求
- 建议使用conda环境管理不同Python版本
- 本例中使用Python 3.12.5版本可正常运行
-
工具准备:
- IDA Pro(用于逆向分析)
- Python环境(用于调试)
初步分析
-
文件构成:
- 题目提供一个.py文件和一个.pyd文件
- .pyd文件相当于DLL,可被同目录下的.py文件直接导入
-
关键函数定位:
- 使用IDA打开.pyd文件
- Shift+F12查看字符串界面,寻找"rand0m"相关字符串
- 在.py脚本中发现调用了
rand0m.check函数 - 在IDA中对
rand0m.check按x进行交叉引用
-
函数引用分析:
- 通常会出现两行引用:
- 第一行是函数的包装函数
- 第二行是函数的内部实现
- 通常会出现两行引用:
调试方法
-
调试准备:
- 编写一个Python文件调用目标函数
- 在函数开头使用
input()以便IDA附加
-
IDA附加调试:
- 运行Python脚本
- 使用IDA附加到python.exe进程
- 在关键函数处设置断点
- 在命令行输入数据触发断点
关键数据结构
-
PyList_New:
- 用于创建新的列表
- 参数指定列表长度(本例中为8)
-
硬编码数据指针:
- 形如
off_7FFE92BAB688[40]的指针存储Python硬编码数据 - 可通过IDA交叉引用查看具体值
- 例如
off_7FFE92BAB688[40]存储值为304643896
- 形如
算法逆向分析
1. 异或操作
tmp1 = input_value ^ 2654435769
- 使用
PyNumber_Xor函数实现 - 第二个操作数为
off_7FFE9DAEB688[44](2654435769)
2. 右移操作
tmp2 = tmp1 >> 5
- 通过右移函数实现
- 查看第二个或第三个参数确定位移量
3. 左移操作
tmp3 = tmp1 << 4
- 使用左移函数实现
- 位移量由
off_7FFE9DAEB688[32]确定
4. 按位与操作
tmp4 = tmp3 & 4198170623
- 使用按位与函数实现
- 操作数为
off_7FFE9DAEB688(4198170623)
5. 组合操作
tmp5 = tmp2 >> 23
tmp6 = tmp4 + tmp5
6. 幂和模运算
tmp7 = ((tmp1 >> 11) ** 65537) % 4294967293
完整算法还原
综合以上分析,可以还原出完整的处理算法:
- 输入值与硬编码常量异或
- 进行一系列位移和位运算
- 执行幂运算和模运算
- 返回处理结果
注意事项
-
静态分析取值:
- 注意查看静态分析中的
off_7FFE9DAEB688[32]等指针 - Cython在动态调试中,32位数值可能只有30位有效
- 注意查看静态分析中的
-
数据类型转换:
- 在IDA中可使用d键将db转为dp查看数据结构
- 注意参数a2是一个结构体,包含处理数据
-
函数识别:
- 重点关注IDA中粉色的函数(核心处理函数)
- 其他辅助函数可暂时忽略
验证方法
- 通过返回值验证还原的算法是否正确
- 对比静态分析结果与动态调试结果
- 编写模拟算法验证处理逻辑
总结
通过本案例,我们掌握了:
- Cython逆向分析的基本流程
- IDA调试Cython编译的.pyd文件的方法
- 识别和还原Cython中的关键算法
- 处理硬编码数据和复杂运算的技巧
这些技能对于解决CTF中日益增多的Cython逆向题目至关重要。