将 .pyc 文件反编译为 0 字节的 .py 文件

逆向工程 Python 反编译
2021-06-13 10:24:13

我正在做类似 CTF 的挑战。其中一项任务需要我们将Python 字节码 3.8(.pyc 文件)反编译为 py 文件。但是,pyc 文件生成的 py 文件是 0 字节原始文件名是flag.py我的程序。

  1. 重命名文件:flag.py->flag.pyc

  2. 使用uncompyle6工具并输入命令:uncompyle6 flag.pyc > flag.py

  3. 它将生成flag.py文件,但它是0 字节几个小时后,它仍然是0字节

  4. 如果我通过键盘中断命令行工具,flag.py文件将有注释:

 uncompyle6 version 3.6.6
 Python bytecode 3.8 (3413)
 Decompiled from: Python 3.8.0 
 [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
 Embedded file name: flag.o.py
 Compiled at: 2020-04-24 16:09:51
 Size of source mod 2**32: 2476187 bytes

我的环境是 MacOS,Python 3.8.0。

.pyc 文件很小,我已经检查了文件头的幻数,它是 Python 3.8.0。这个pyc文件的不寻常之ff 00处在于文件末尾有几千个

55 0d 0d 0a 00 00 00 00
...
ff 00 ff 00 ff 00 ff 00 
...
ff 00 ff 00 ff 00 ff 00 
b9 01 0c 06 0a 01 08 01

有什么建议?

1个回答

pyc文件可能被混淆/格式错误,从而导致 uncompyle6。您可以尝试反汇编文件而不是反编译。

dis模块可以反汇编 Python 字节码。您可以按如下方式使用它。

import marshal, dis

f = open("flag.pyc", "rb")
f.seek(16) # Skip 16 byte header (for Python 3.8)
co = marshal.load(f)
print(dis.dis(co))

还存在其他 Python 反汇编程序库,如xdis. 安装包 ( pip install xdis) 后,您只需运行pydisasm flag.pyc即可反汇编pyc

一旦你想通了跳闸uncompyle6的原因,你可以删除这些零部件并重新组装修正PYC使用XASM然后可以反编译。