1. 项目概述:从一道CTF题看Python逆向的完整路径
最近在复盘一些经典的CTF题目,正好翻到了这道“[GWCTF 2019]pyre”。这道题在圈内挺有名的,算是Python逆向的入门级“劝退”题,也是很多朋友从Web、Pwn转向逆向分析时遇到的第一道坎。题目本身是一个被打包成可执行文件的Python脚本,核心考察点就是如何从打包的二进制文件中提取出原始的Python字节码(.pyc文件),然后进行反编译和分析,最终找到并理解其内置的验证逻辑,写出逆向脚本或直接计算出Flag。
我之所以想详细拆解这道题,是因为它几乎涵盖了Python逆向分析中所有最基础、最核心的环节:文件类型识别、PyInstaller打包程序解包、pyc文件修复、反编译工具使用、字节码阅读以及最后的算法逆向。整个过程就像一次标准的手术,每一步都有其明确的工具和目的。对于刚接触逆向的新手来说,跟着走一遍,不仅能拿到Flag,更能建立起一套处理类似问题的肌肉记忆。而对于有经验的朋友,或许也能从中回顾一些容易被忽略的细节,比如pyc文件的魔数修复,或者如何快速定位关键代码。
这道题的目标很明确:你拿到一个名为“pyre”的可执行文件(在Linux下可能是 pyre ,在Windows下可能是 pyre.exe ),运行后它会提示你输入flag,然后进行验证。我们的任务就是不运行它(或者运行了也不知道逻辑),通过静态分析的手段,把它内部的验证算法给“扒”出来。
2. 解题环境与工具链准备
工欲善其事,必先利其器。Python逆向虽然门槛相对较低,但工具选型不对或者环境没搭好,也会让你在第一步就卡上半天。下面是我在多次实战中总结下来的一套稳定、高效的工具组合。
2.1 核心工具介绍与选型理由
file / Detect It Easy (DIE) :用于初步文件分析。在Linux或Mac下,直接用 file 命令就能看出文件是ELF可执行文件,并且通常会有“Python”字样,提示这是PyInstaller打包的。在Windows下,我强烈推荐使用 Detect It Easy (DIE) 。它比传统的PEiD更强大,能识别出大量的打包器、编译器类型。用它打开 pyre.exe ,能立刻告诉你这是用PyInstaller打包的,这直接决定了我们后续的解包方向。
pyinstxtractor.py :这是解包PyInstaller打包程序的“瑞士军刀”。它是一个Python脚本,由ExtremeCoders开发。为什么必须用它?因为PyInstaller打包时,会把Python解释器、依赖库以及你的脚本字节码全部塞进一个可执行文件里。 pyinstxtractor.py 的作用就是把这个复合结构拆开,把我们最关心的 .pyc 字节码文件提取出来。直接从GitHub上搜索下载即可。
uncompyle6 / pycdc :反编译工具。提取出的 .pyc 文件是字节码,人类难以直接阅读。我们需要反编译成Python源代码。
- uncompyle6 :老牌、稳定,对Python 3.7及以下版本的字节码支持非常好。安装简单: pip install uncompyle6 。它的优点是出错时提示相对友好。
- pycdc :后起之秀,采用C++编写,速度极快,并且对高版本Python(如3.8+)的字节码支持更好。需要从源码编译,但对于这道2019年的题,两者都能胜任。我通常两个都备着,一个不行换另一个。
010 Editor / WinHex / HxD :十六进制编辑器。这是修复pyc文件头的关键工具。因为从PyInstaller提取出来的pyc文件,文件头(主要是魔数magic number)可能被去掉了,导致反编译工具无法识别。我们需要手动补上正确的文件头。
Python 环境 :准备一个与题目可能使用的Python版本相近的环境,用于运行我们修复和反编译后的脚本,或者运行我们写的逆向脚本。根据题目年份(2019),Python 3.6或3.7的环境比较合适。
注意 :工具版本很重要。特别是 uncompyle6 和 pycdc ,对Python字节码版本的兼容性很敏感。如果遇到反编译失败,首先应该怀疑是不是pyc文件的Python版本不对,或者文件头不完整。
2.2 环境搭建与快速配置
对于新手,我建议在Windows下操作,因为图形化工具多。可以按照这个顺序快速搭建:
这样,最基本的工具链就齐了。Linux或Mac用户操作类似,包管理更简单,但可能需要自己编译 pycdc 。
3. 第一步:文件解包与pyc提取
拿到




