内容参考大佬视频【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
uncompyle6
-o 目标生成的Python文件名 原pyc文件名
62bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2P5s2c8J5k6h3#2W2j5$3!0V1k6i4u0K6i4K6u0V1M7X3g2Q4x3V1k6V1k6h3y4G2L8i4m8&6L8r3g2Q4x3X3c8T1N6h3W2D9k6s2x3`.
pycdc -o output_file.py your_file.pyc
当然也可以使用一些在线网站将Pyc文件转换为python文件
一般来说py文件打包生成的exe的图标是
并且如果直接使用IDA打开会有很多包含python的字样
然后即可以判断是Py文件打包而成的exe
这个时候我们需要使用Pyinstxtractor工具将exe文件进行解包
pyinstxtractor.py 工具的下载地址:23dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2X3L8%4u0Y4k6g2)9J5k6h3&6W2N6q4)9J5c8Y4m8J5L8$3A6W2j5%4c8K6i4K6u0r3M7s2W2A6L8Y4y4@1j5h3I4D9k6i4u0W2P5s2c8J5j5h3y4@1L8%4u0Q4x3V1j5`.
pyinstxtractor.py
将上面下载好的pyinstxtractor文件复制到题目所在目录下
然后直接在打包的exe的路径下打开终端
使用命令:python pyinstxtractor.py 待解包的文件名.exe
然后获得生成的解包后的文件夹
打开extracted文件夹
一般来说我们会获得一个和我们解包的exe同名的pyc文件,这个时候就和第一种类型题目一样,将pyc文件还原成py文件进行逆向即可
但是有特殊情况,因为使用Pyinstxtractor进行解包以后源文件一般不会包含原始的魔术数字和时间戳,在反编译的时候就可能会出错,如下图查看login.pyc
而解包后的 struct.pyc 文件会保留其原始的 Python .pyc 文件的魔数和时间戳信息
struct.pyc
.pyc
所以我们通常使用strcut.pyc中的信息对原来的Pyc进行补全
将E3前的数字复制粘贴到test.pyc的前面即可
然后保存即可正常得到Py文件
如果出题人给的题目形式如下,那么我们应该怎么操作呢
用于反汇编 Python 字节码。它可以将 Python 函数或代码对象的字节码指令序列转换成我们的可读形式,显示每个字节码指令的操作码和操作数。
dis.dis 函数的作用:
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 字节结尾
.py
注意:Python3的pyc文件头部并非固定的 16 个字节,而是一个不确定的长度,至少是 12 个字节,加上源文件名字符串的长度
在交互模式下:
#反汇编字节码
最后获得输出(可以理解为python的汇编)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
方向感 用CPython编译成了pyd的如何解决?
bygreencn python 3.10以上的版本用啥反编译。