squid
密码: ubgs
根据字符串信息,初步可以判断是pyinstaller打包的ELF程序。
注意:运行时千万不要和其他文件放在同一个文件夹!!!
注意:运行时千万不要和其他文件放在同一个文件夹!!!
注意:运行时千万不要和其他文件放在同一个文件夹!!!
查看生成的Readme.txt文件内容
说是勒索病毒,让我们不要再运行了。
没关系,打好快照,不怕,再次运行。
可以看到文件的后缀名被改为了
.WNCRY
,如果当前目录存在其他文件和文件夹的话,后缀名也会被修改(血的教训)。
但好在它只是改了文件的后缀,并非真的勒索病毒,虚晃一枪。
可以看到,即使被修改了后缀名的文件,依然是可以运行的,文件内容没变。
首先使用
pyinstxtractor
进行解包。
解出的内容如下:
使用
struct.pyc
的文件头修复
squid.pyc
的文件头
修复后:
使用python的
uncompyle6
模块对pyc文件进行反编译。
不难发现重点在于
squid_game
这个模块的
get_delbat
方法,但在目录中并不存在
squid_game.pyc
或相关文件。
使用grep搜索一下:
发现除了squid.py引用了这个字符串,PYZ-00.pyz也包含这个字符串,猜测squid_game模块是被打包在了PYZ-00.pyz中。
根据以前的经验,猜测出题人肯定使用了带
-key
参数的pyinstaller进行打包,因此找了半天的
pyiboot00_crypto_key.pyc
文件。
最后发现这道题并没有使用
-key
参数。
根据看雪论坛的
一篇文章
,可以使用pyinstaller模块自带的一个工具分析pyz文件。
首先使用archive_viewer分析文件内容,分析结果和之前解包的内容大致相同。
这个工具也提供了三个选项,分别用于
U:展示列表
、
O:打开文件
、
X:解包文件
:
使用O选项查看PYZ-00.pyz包含的内容:
在列表中成功找到了squid_game模块:
尝试使用X选项将它提取出来:
然后修复squid_game.pyc的文件头:
再使用uncompyle6进行反编译:
成功读到了源码:
发现关键在于get_time函数,对四个flag进行了切片重组,重组后的内容就是flag。
将关键代码复制出来稍加修改,执行一遍就能得到flag:
a = 'flag{c4ca4238a0b923820dcc509a6f75849b}'
b = 'flag{c81e728s9d4c2f636f0f7f89cc14862c}'
c = 'flag{eccbc87e4b5ce2fe28308fd9fsa7baf3}'
d = 'flag{a87ff679a2f3e71d9181a67b7542122c}'
flag = a[0:8] + b[9:14] + c[6:20] + d[-1:]
print(flag)
看雪论坛:[原创]Python逆向——Pyinstaller逆向
Python是解释型语言,没有严格意义上的编译和汇编过程。但是一般可以认为编写好的python源文件,由python解释器翻译成以.pyc为结尾的字节码文件。pyc文件是二进制文件,可以由python虚拟机直接运行。Python在执行import语句时,将会到已设定的path中寻找对应的模块。并且把对应的模块编译成相应的PyCodeObject中间结果,然后创建pyc文件,并将中间结果写入该文件。
(pyc就是py变成exe的中间文件,可以理解为高级语言要先变成汇编语言在被翻译为机器的01语言
那么怎么反汇编呢?
这里要说的就是uncompyle工具,功能就是将pyc文件反编译成py文件,具体操作方法是将cmd命令行的指向指向pyc文件所在目录之后,输入如下指令
uncompyle6 -o *.py *.pyc
要注意的是要在环境变量中配置的路径是python2的python3会反编译不成功
第二步代码审计,可以观察到它对真正的flag做了如下处理
1.首先下载 pyinstxtractor.py
2.下载完成后将pyinstxtractor.py和将要反编译的exe放在同一文件夹下。直接cmd进去该路径,然后输入 python pyinstxtractor.py XX.exe 执行完成后,在该文件夹里会出现XX.exe_extracted文件夹。
3.打开XX.exe_extracte...
因为pyinstaller方便、兼容性相对较好,所以我们会经常见到一些用pyinstaller打包的Python程序,在这里我们了解一下如何对这些打包好的exe文件进行反编译(即反编译出.py文件),也可以通过对抗去改进我们程序的保护措施。
0.前提准备
我们首先要确认一个exe程序他是不是由pyinstaller编译的,如果不是那就没必要再往下操作了。
一般我们可以看程序图标,比较标志性的两个
上方图标表示不带命令行(即pyinstaller -w)
下方图标表示带命令行