StrangeLanguage WriteUp
题目给了main.exe
,看大小和图标判断是使用pyinstaller将py文件打包成的可执行文件,简单运行,让你输入(猜测输入flag),然后会有提示"nonono"
提取py
使用工具PyInstaller Extractor可直接提出pyc,再使用Uncompyle6反编译就能得到main.py
python .\pyinstxtractor.py main.exe
cd .\main.exe_extracted\
uncompyle6 main.pyc > main.py
# main.py
import brainfuck
brainfuck.main_check()
可以看到main.py
里只是调用brainfuck模块,在提取的文件中里刚好有个brainfuck模块brainfuck.cp38-win_amd64.pyd,因此程序的主要逻辑大概率在该模块中
pyd逆向
.pyd是一种python动态模块,本质上是dll文件,故拿出ida分析一波,直接从入口点分析难度太大,先看Strings Window,如果了解过brainfuck(bf)代码形式,很容易就能发现有一串bf,idc脚本将其搞出来,先看看这串代码干什么用的
使用brainfuck解释器运行这串代码发现运行结果和main.exe
的运行结果完全一致,遂猜测这就是程序的主要逻辑,bf模块只是个解释器,负责解释bf代码,到这里调用逻辑很清楚了main->bf.pyd->bf代码
,因此只要弄清楚bf代码实现的功能就可以拿到flag
bf代码逆向
这部分是整个逆向过程中最难的了,因为bf代码的基本操作非常简单,相当于最原始的图灵机,而该bf代码使用基本运算实现了复杂操作,鉴于并没有很好bf逆向工具,因此只能硬来,这里主