pyinstaller / pyc Python逆向 一键反编译 含例子
点我移步GITHUB项目链接
软件在项目的Release目录中
一个简单的python反编译封装,一键快速反编译。喜欢的话给个Star💖吧😘
如果有问题可以下方留言哦
1.反编译
./pyre xxxx.exe #pyinstall程序
or
./pyre xxxx.pyc
Notice: 生成汇编码需要将项目的编译环境 与 pyc 的环境一致 (可选) 【无法生成反编译也会尝试用cdc进行反编译尝试】
tip:汇编码用于 当 cdc 无法反编译时,审计,去除花指令等查看使用
pyinstaller程序反编译存放于 {{FileName}}_extracted 中的 {{FileName}}_py 中
pyc当前目录下放于当前
#直接调用python文件反编译
pyre.py
调用runner()函数
runner({{FileName}})
tip. 尽量将程序放在该项目下进行反编译哦
2.指令查找
./pyre --search JUMP_FORWARD
./pyre --search {{Command}}
参考案例
来自于第七届浙江省安全技能赛初赛RE题
ezRE Writeup
./pyre ezRe.pyc #尝试直接反编译
发现报错,点击终止即可。
审计汇编码
发现 JUMP_FORWARD 花指令
搜索得到该指令字节码为 6E , 进行NOP填充
再次反编译
./pyre ezRe.pyc
反编译成功
调整代码,获取密文,下面是POC
# Source Generated with Decompyle++
# File: ezRe.pyc (Python 3.9)
import base64
key = '7e021a7dd49e4bd0837e22129682551b'
key = (lambda s: [ ord(i) ^ 102 for i in s ])(key)
s = list(range(256))
j = 0
for i in range(256):
j = (j + s[i] + key[i % len(key)]) % 256
s[i],s[j] = s[j],s[i]
i = j = 0
data = []
for _ in range(50):
i = (i + 1) % 256
j = (j + s[i]) % 256
s[i],s[j] = s[j],s[i]
data.append(s[(s[i] + s[j]) % 256])
result = ''
text = "w53Cj3HDgzTCsSM5wrg6FMKcw58Qw7RZSFLCljRxwrxbwrVdw4AEwqMjw7/DkMKTw4/Cv8Onw4NGw7jDmSdcwq4GGg=="
text = base64.b64decode(text).decode()
for c, k in zip(text, data):
result += chr(ord(c) ^ 51 ^ k)
print(result)
成功获取flag
作者:VictorGanro