内容参考大佬视频【Python逆向】浅谈CTF-Python逆向_哔哩哔哩_bilibili
讲述一下常见的python题型
除了直接获得题目内容的python文件外,出题人也可以稍微加工一点点,给出题目python文件所对应的pyc文件,即python的字节码
PYC 文件的定义
pyc 文件是 python 在编译过程中出现的主要中间过程文件。pyc 文件是二进制的,类似 java 的字节码,可以由 python 虚拟机直接执行的。
这个时候我们一般使用uncompyle6(适用于python3.8)或者Pycdc将pyc文件反编译成py文件
命令:
pip install uncompyle6
安装完成后可以使用
uncompyle6 --version
查看是否安装成功,若成功显示版本号,则安装成功
(注意:下载的uncompyle6的版本最好别高于所使用的python版本)
使用命令:
uncompyle6
-o output_file.py your_file.pyc
-o 目标生成的Python文件名 原pyc文件名
https://github.com/extremecoders-re/decompyle-builds
pycdc -o output_file.py your_file.pyc
当然也可以使用一些在线网站将Pyc文件转换为python文件
一般来说py文件打包生成的exe的图标是
并且如果直接使用IDA打开会有很多包含python的字样
然后即可以判断是Py文件打包而成的exe
这个时候我们需要使用Pyinstxtractor工具将exe文件进行解包
pyinstxtractor.py
工具的下载地址:https://sourceforge.net/projects/pyinstallerextractor/
将上面下载好的pyinstxtractor文件复制到题目所在目录下
然后直接在打包的exe的路径下打开终端
使用命令:python pyinstxtractor.py 待解包的文件名.exe
然后获得生成的解包后的文件夹
打开extracted文件夹
一般来说我们会获得一个和我们解包的exe同名的pyc文件,这个时候就和第一种类型题目一样,将pyc文件还原成py文件进行逆向即可
但是有特殊情况,因为使用Pyinstxtractor进行解包以后源文件一般不会包含原始的魔术数字和时间戳,在反编译的时候就可能会出错,如下图查看login.pyc
而解包后的 struct.pyc
文件会保留其原始的 Python .pyc
文件的魔数和时间戳信息
所以我们通常使用strcut.pyc中的信息对原来的Pyc进行补全
将E3前的数字复制粘贴到test.pyc的前面即可
然后保存即可正常得到Py文件
如果出题人给的题目形式如下,那么我们应该怎么操作呢
用于反汇编 Python 字节码。它可以将 Python 函数或代码对象的字节码指令序列转换成我们的可读形式,显示每个字节码指令的操作码和操作数。
dis.dis
函数的作用:
例如,对于一个简单的 Python 函数:
使用 dis.dis
来查看其字节码:
import dis
dis.dis(add_numbers)
输出结果:
0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_ADD
6 RETURN_VALUE
Python 标准库中的一个模块,提供了对 Python 对象进行序列化(转换为字节流)和反序列化(从字节流恢复为对象)功能。
python2的pyc文件的前4个字节是一个固定的魔数(03 F3 0D 0A),而紧接着的后 4 个字节表示编译这个 .pyc
文件的 Python 解释器的版本号
python3的pyc文件前4个字节是固定的魔数
(33 0D 0D 0A),然后是两个字节的时间戳,标识了 .py
文件的最后修改时间,
接着是 4 个字节的源文件大小,最后是源文件名的字符串,以 null 字节结尾
注意:Python3的pyc文件头部并非固定的 16 个字节,而是一个不确定的长度,至少是 12 个字节,加上源文件名字符串的长度
在交互模式下:
#反汇编字节码
最后获得输出(可以理解为python的汇编)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!