Python逆向-PYC
Python逆向——PYC
了解什么是pyc
pyc 文件是 Python 将 .py 源代码编译后生成的字节码文件,主要有以下几个特点和作用:
加速执行:直接执行 .pyc 字节码,可以跳过反复编译的步骤,直接运行已编译好的字节码,从而加快执行速度;
隐藏源代码:包含编译后的字节码,而不会包含原始的源代码,可对源代码进行加密或者保护源代码不被用户访问;
跨平台运行:不同平台编译的 .pyc 字节码文件可在其它平台上运行,可以将 Python 程序打包成 .pyc 文件在不同系统上分发和运行;
冗余检查:Python解释器会根据 .py 文件的修改时间来检查 .pyc 文件是否过期;如果 .py 文件没有改动,.pyc 可以直接重用,避免重复编译;
支持单文件运行:可以只发布 .pyc文件让用户直接运行,而不需要随附源代码,一定程度上保护代码;
节省内存:只加载 .pyc 文件可以减少内存开销,因为不需要加载源码。
| 1 | 以上转载自原文链接:https://blog.csdn.net/m0_70885101/article/details/134393740 | 
.pyc 文件是 Python 编译后的字节码文件,不是直接可读的文本文件,所以无法直接用文本/代码编辑器打开或查看其具体内容。看起来有点束手无策,但是本着卤水点豆腐——一物降一物的法则,总有方法的。
解题方法
第一种,如果是直接的pyc文件,可以找python反编译在线工具(https://www.lddgo.net/string/pyc-compile-decompile), 比较简单的是可以这样的,但毕竟不是长久之计。
第二种,先下载pyinstxtractor.py工具,可以从网上搜索并自行下载,安装uncompyle库,使用pip命令安装。在cmd中输入命令。
命令:pip install uncompyle6
将所得的pyc文件与pyinstxtractor.py文件放在一起,打开cmd,输入 uncompyle6 文件名.pyc > 文件名.py 再回车一下,就可以得到py文件。得到py文件后,我们用VScode打开,就可以看到庐山真面目了。
比如NSSCTF上的[HUBUCTF 2022 新生赛]ezPython,我们下载后是一个pyc文件

得到py文件并打开

分析一下,第一行读取了一个名为password.txt的文本文件的内容,并将这个内容存储在变量password中
tmp = bytes_to_long(password.encode(“utf-8”)) #将密码字符串编码为UTF-8格式的字节串,然后bytes_to_long函数将这个字节串转换为一个长整型
ans = base64.b64encode(base58.b58encode(str(tmp))).decode()#先使用str(tmp)将上一步得到的长整型数字转换为字符串形式,再base58,再base64编码
如果你的crypto库没有问题的话,以下的脚本可以运行,有问题的话,可以找在线网站去解base64,base58,再单写一个长整型转字节型的就OK了。

NSSCTF{fd78ee3399dd6a3c1d0b637fdca0c075}
解题思路
1.pyc文件转py文件
2.exe文件转pyc文件再转py文件
先放到查壳软件里查,可以看到语言是Python,打包工具是Pylnstaller,就是考察exe转pyc,转py

将这个exe文件放在pyinstxtractor.py工具一个目录下,然后打开终端,输入命令
python pyinstxtractor.py 文件名.exe 再回车一下,

会看到一个新的与exe文件同名的文件夹,点进去查看会看到struct.pyc文件,胆大心细一下,找到你觉得可疑的文件,这个文件夹里明显是1.pyc文件。struct.pyc文件是标准正确的的文件头,1.pyc和struct.pyc需要放到010里面查看,1.pyc是否有文件头,文件头是否与标准的文件头相同。改成一致的后保存。

改好后进行pyc文件转py文件,然后点进去查看


进行分析,可以得知a就是flag,flag的长度是42,flag中的每个元素的Unicode值与33相乘再与179取余要等于c[i]。
进行爆破写出exp

flag:NSSCTF{2889e7a3-0d6b-4cbb-b6e9-04c0f26c9dca}



