浅谈ctf中的python逆向
字数 1567 2025-08-06 23:10:31

CTF中的Python逆向技术详解

一、Python逆向题目分类

在CTF逆向题目中,Python类题目占比快速上升,主要分为以下四种类型:

  1. pyc文件 - 直接提供的Python编译字节码文件
  2. 给出pyc字节码txt - 以文本形式提供的Python字节码
  3. 加花pyc - 经过混淆或加密处理的pyc文件
  4. 打包成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. 逆向步骤

  1. 检查文件头是否完整(通常前4字节为Python版本魔数)
  2. 使用反编译工具尝试直接反编译
  3. 若失败,可能需要修复文件头或处理混淆

三、pyc字节码文本逆向

当题目直接给出字节码文本时:

1. 理解Python字节码

  • 每条指令格式:偏移量 操作码 [参数]
  • 常见操作码:
    • LOAD_CONST:加载常量
    • LOAD_NAME:加载变量名
    • CALL_FUNCTION:调用函数
    • BINARY_ADD:加法运算
    • COMPARE_OP:比较操作

2. 手动逆向方法

  1. 分析字节码控制流
  2. 识别函数调用和变量操作
  3. 重建原始Python逻辑

四、加花pyc逆向

1. 常见加花技术

  • 修改文件头魔数
  • 字节码混淆
  • 自定义编码/加密
  • 参考案例:VNCTF2022 Baby_Maze

2. 处理方法

  1. 检查文件头是否被修改
  2. 尝试修复标准pyc文件头
  3. 分析自定义编码模式
  4. 可能需要编写自定义解码脚本

五、打包成exe的Python逆向

1. 识别打包工具

  • PyInstaller
  • py2exe
  • cx_Freeze
  • Nuitka

2. 逆向步骤

  1. 使用工具解包exe:
    • PyInstaller打包的:使用pyinstxtractor
    python pyinstxtractor.py target.exe
    
  2. 提取其中的pyc文件
  3. 按照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

七、实战技巧

  1. 版本匹配:确保反编译工具与Python版本匹配
  2. 文件头修复:缺失头部的pyc可尝试添加标准头
  3. 动态调试:对复杂逻辑可尝试修改后重新运行
  4. 交叉验证:使用不同工具反编译对比结果
  5. 字符串分析:直接搜索pyc中的可见字符串获取线索

八、进阶挑战

  1. 自定义marshal数据:处理非标准序列化的代码对象
  2. 反反编译技术:对抗专门防止反编译的混淆
  3. 性能优化代码:分析使用了__slots__等特性的代码
  4. C扩展逆向:处理包含C扩展模块的情况

通过系统掌握这些Python逆向技术,可以有效应对CTF中日益增多的Python逆向题目挑战。

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反编译工具 pycdc :另一个有效的反编译器 dis模块 :Python自带的反汇编工具 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 提取其中的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逆向题目挑战。