浅谈ctf中的python逆向
字数 1567 2025-08-06 23:10:31
CTF中的Python逆向技术详解
一、Python逆向题目分类
在CTF逆向题目中,Python类题目占比快速上升,主要分为以下四种类型:
- pyc文件 - 直接提供的Python编译字节码文件
- 给出pyc字节码txt - 以文本形式提供的Python字节码
- 加花pyc - 经过混淆或加密处理的pyc文件
- 打包成exe的py文件 - 使用PyInstaller等工具打包的Python程序
二、pyc文件逆向
1. pyc文件基础
- pyc是Python的编译字节码文件
- 包含Python源代码编译后的字节码指令
- 文件结构:魔数+时间戳+代码对象
2. 逆向工具
- uncompyle6:最常用的pyc反编译工具
uncompyle6 target.pyc > decompiled.py - pycdc:另一个有效的反编译器
- dis模块:Python自带的反汇编工具
import dis dis.dis(open('target.pyc', 'rb').read())
3. 逆向步骤
- 检查文件头是否完整(通常前4字节为Python版本魔数)
- 使用反编译工具尝试直接反编译
- 若失败,可能需要修复文件头或处理混淆
三、pyc字节码文本逆向
当题目直接给出字节码文本时:
1. 理解Python字节码
- 每条指令格式:
偏移量 操作码 [参数] - 常见操作码:
LOAD_CONST:加载常量LOAD_NAME:加载变量名CALL_FUNCTION:调用函数BINARY_ADD:加法运算COMPARE_OP:比较操作
2. 手动逆向方法
- 分析字节码控制流
- 识别函数调用和变量操作
- 重建原始Python逻辑
四、加花pyc逆向
1. 常见加花技术
- 修改文件头魔数
- 字节码混淆
- 自定义编码/加密
- 参考案例:VNCTF2022 Baby_Maze
2. 处理方法
- 检查文件头是否被修改
- 尝试修复标准pyc文件头
- 分析自定义编码模式
- 可能需要编写自定义解码脚本
五、打包成exe的Python逆向
1. 识别打包工具
- PyInstaller
- py2exe
- cx_Freeze
- Nuitka
2. 逆向步骤
- 使用工具解包exe:
- PyInstaller打包的:使用
pyinstxtractor
python pyinstxtractor.py target.exe - PyInstaller打包的:使用
- 提取其中的pyc文件
- 按照pyc逆向方法继续分析
3. 注意事项
- 可能缺少pyc文件头,需要手动修复
- 可能包含多个pyc模块文件
- 可能需要处理依赖库
六、实用工具汇总
| 工具名称 | 用途 | 命令示例 |
|---|---|---|
| uncompyle6 | pyc反编译 | uncompyle6 target.pyc |
| pycdc | pyc反编译 | ./pycdc target.pyc |
| dis | 字节码反汇编 | python -m dis target.py |
| pyinstxtractor | 解包PyInstaller | python pyinstxtractor.py target.exe |
| pyi-archive_viewer | 查看PyInstaller包 | pyi-archive_viewer target.exe |
七、实战技巧
- 版本匹配:确保反编译工具与Python版本匹配
- 文件头修复:缺失头部的pyc可尝试添加标准头
- 动态调试:对复杂逻辑可尝试修改后重新运行
- 交叉验证:使用不同工具反编译对比结果
- 字符串分析:直接搜索pyc中的可见字符串获取线索
八、进阶挑战
- 自定义marshal数据:处理非标准序列化的代码对象
- 反反编译技术:对抗专门防止反编译的混淆
- 性能优化代码:分析使用了
__slots__等特性的代码 - C扩展逆向:处理包含C扩展模块的情况
通过系统掌握这些Python逆向技术,可以有效应对CTF中日益增多的Python逆向题目挑战。