第二届广东省大学生网络攻防大赛 pyre
.
.
以前做过 pyc 逆向,直接的 python exe 逆向还是第一次:
第一种方法:
用 pyinstxtractor.py 将 exe 文件转换成 pyc 文件。
.
.
用 PyInstaller 打包后,pyc 文件的前 8 个字节会被抹掉,所以最后要自己添加回去。前四个字节为 python 编译的版本,后四个字节为时间戳。想要获得编译版本可以查看打包文件里 struct 的信息,我这里还是提取出 struct 这个文件,有 struct 作为对照就方便多了,不用特定下载对应版本的 python 来生成特定的 pyc 文件来取前 8 个字节:
.
.
然后利用在线工具 或 https://tool.lu/pyc/
工具“Easy Python Decompiler v1.3.2” 或 uncompyle6 main.pyc > main.py 命令反编译成 py 文件:
def check():
a = input('plz input your flag:')
c = [144,163,158,177,121,39,58,58,91,111,25,158,72,53,152,78,171,12,53,105,45,12,12,53,12,171,111,91,53,152,105,45,152,144,39,171,45,91,78,45,158,8]
if len(a) != 42:
print('wrong length')
return 0
b = None
for i in range(len(a)):
if ord(a[i]) * 33 % b != c[i]:
print('wrong')
return None
print('win')
check()
.
.
这里的 b 爆破出来是 179:
(但是后来用 uncompyle6 发现 b=179,所以应该是在线反编译时没编译完全,毕竟反编译出来的 b=None 逻辑没法通)
a=list("flag")
c=[144,163,158,177]
for i in range(4):
for b in range(1,1000):
if (ord(a[i]) * 33 %b) == c[i]:
print(b)
break
.
.
解密脚本如下:
def check():
c = [144,163,158,177,121,39,58,58,91,111,25,158,72,53,152,78,171,12,53,105,45,12,12,53,12,171,111,91,53,152,105,45,152,144,39,171,45,91,78,45,158,8]
flag=""
b=179
for i in range(42):
for j in range(32,127):
if j *33 %b == c[i]:
flag+=chr(j)
break
print(flag)
check()
.
.
.
.
第二种方法:
利用 pyinstall 包来反编译:
先下载对应的包 pip install pyinstaller ,如果想对比的话可以用 pyinstaller --onefile --nowindowed xxx.py 这个命令来生成可执行文件。
.
下载后去到 用 pyinstaller 包的 archive_viewer.py 所在目录下,用命令 python archive_viewer.py xxx.exe 来解包。
.
.
自己菜,所以要多学习~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)