从CTF实战出发:手把手教你修复Python 3.7魔改pyc文件(附完整脚本)
从CTF实战出发手把手教你修复Python 3.7魔改pyc文件附完整脚本逆向工程中pyc文件的修复是一个常见但容易被忽视的技能点。尤其在CTF竞赛中出题人常常通过修改pyc文件的magic number来增加题目难度。本文将从一个真实的CTF题目出发详细讲解如何识别和修复被魔改的Python 3.7 pyc文件并提供一个可复用的修复脚本。1. Python pyc文件结构解析Python的pyc文件是Python源代码编译后的字节码文件它包含以下几个关键部分Magic Number4字节标识Python版本和编译时间Timestamp4字节源文件修改时间Code Object包含编译后的字节码对于Python 3.7正常的magic number是0x420d小端序存储为0x0d42。这个值可以通过以下Python代码获取import importlib.util print(hex(importlib.util.MAGIC_NUMBER))2. 识别被魔改的pyc文件当遇到无法反编译的pyc文件时首先需要检查其magic number。以下是识别步骤使用hex编辑器查看文件头部检查前4字节是否匹配已知Python版本的magic number如果发现异常值可能是被故意修改在我们的案例中文件头部显示为71 02 00 00 [异常magic number] 33 34 07 00 [文件大小字段]通过对比正常Python 3.7的pyc文件可以确定magic number被修改且文件大小字段前多出了一个7102的额外字段。3. pyc文件修复实战修复被魔改的pyc文件需要以下步骤3.1 确定正确的magic number通过fuzz测试或版本推断确定原始Python版本。本例中确认为Python 3.7因此magic number应为0x420d。3.2 修复文件结构修复操作包括替换错误的magic number移除多余的字段调整文件大小字段以下是修复前后的结构对比偏移量修复前修复后0x0071 0242 0d0x0200 0000 000x0433 3433 340x0607 0007 003.3 完整修复脚本以下是一个自动修复pyc文件的Python脚本import struct def repair_pyc(input_file, output_file, correct_magic0x420d): with open(input_file, rb) as f: data f.read() # 检查是否有异常字段 if data[0:2] b\x71\x02: # 移除异常字段修正magic number repaired_data struct.pack(H, correct_magic) data[4:] # 调整文件大小字段本例中需要减2 size struct.unpack(I, repaired_data[4:8])[0] repaired_data repaired_data[:4] struct.pack(I, size-2) repaired_data[8:] else: repaired_data data with open(output_file, wb) as f: f.write(repaired_data) # 使用示例 repair_pyc(corrupted.pyc, repaired.pyc)4. 验证修复结果修复完成后可以使用uncompyle6等工具验证文件是否可正常反编译uncompyle6 repaired.pyc如果修复成功将输出可读的Python源代码。在本案例中修复后成功反编译出以下关键代码片段import struct O0O00O00O00O0O00O [A,B,C,...] # 省略部分字符 def encode(O000O00000OO00OOO): OOOO00OOO00O000OO 0 OOOOOOOOOO00O0OOO 0 OO0OOO000000OOOOO # ... 省略后续代码5. 进阶技巧与注意事项5.1 常见魔改手法除了修改magic number出题人还可能使用以下手法修改时间戳字段在文件中间插入垃圾数据修改字节码指令5.2 修复工具推荐uncompyle6主流的Python反编译工具pycdc另一个强大的反编译器010 Editor十六进制编辑器带有pyc模板5.3 调试技巧当修复后仍无法反编译时可以尝试使用dis模块直接查看字节码比较正常pyc文件的结构差异使用不同版本的Python解释器尝试6. 实战案例扩展在实际CTF比赛中pyc文件修复往往只是第一步。以我们的案例为例修复后还需要分析反编译得到的加密算法理解自定义的Base91编码实现编写解密脚本获取flag完整的解题流程体现了从二进制修复到算法分析的完整逆向工程技能链。掌握pyc文件修复技术不仅对CTF比赛有帮助在实际的Python逆向工程和安全分析中也十分实用。通过本文的详细讲解和提供的脚本希望读者能够建立起系统的pyc文件分析能力。