首页
社区
课程
招聘
[推荐]Python逆向总结
发表于: 2024-7-17 23:05 9222

[推荐]Python逆向总结

2024-7-17 23:05
9222

内容参考大佬视频【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的汇编)


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 9
支持
分享
最新回复 (6)
雪    币: 1790
活跃值: (3701)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
总结性好文章,不过能问下好像是Python 3.8以上用uncompyle6和pycdc反编译由于缺少对新指令的支持而报错的问题该怎么解决吗?
2024-7-19 00:12
0
雪    币: 1382
活跃值: (3786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
用CPython编译成了pyd的如何解决?
2024-7-20 12:18
0
雪    币: 219
活跃值: (290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
厉害了,楼主!
2024-7-24 10:52
0
雪    币: 409
活跃值: (638)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
方向感 用CPython编译成了pyd的如何解决?
可以先去学习一下cython的语言特性,然后ida硬逆
2024-8-3 13:37
1
雪    币: 1378
活跃值: (2505)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2024-8-5 10:53
0
雪    币: 4
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享。。
2024-8-6 21:15
0
游客
登录 | 注册 方可回帖
返回
//