因為見到好多re題都是這個圖標 ↓ 的exe,於是決定總結一下這種python題目的套路(其實是怕太久沒遇到就忘了怎么做了。
P.S. 前幾天XCTF遇到一道極其少見的pyinstaller打包elf的逆向題,於是對本文進行了更新,添加解包elf內容,並更名為"關於pyinstaller打包文件的復原",記錄pyinstaller打包后的exe和elf如何解包->反編譯->獲得py源碼的過程。
BTW:此篇blog主要是為了方便自己復制粘貼,所以命令里也直接放上路徑了,把對應路徑替換成自己的就好。
環境和工具:win10 + wsl2 + 010Editor
pyinstxtractor項目地址:extremecoders-re/pyinstxtractor: PyInstaller Extractor
uncompyle6安裝方法見:uncompyle6安裝使用方法
pyinstxtractor
兩種格式的解包方式只有這一part不一樣,下面的操作流程都相同。
exe
在cmd運行(easyRE.exe當前目錄下打開:
cp D:\_CTF_\_Tools_\pyinstxtractor.py .
python2 pyinstxtractor.py easyRE.exe
其中第一行是將pyinstxtractor.py復制到當前目錄下,然后第二行是使用pyinstxtractor(注意是python2)。
會在當前目錄生成easyRE.exe_extracted文件夾,其中有用的是easyRE
(一般是解包提示是entry point的名字)和struct
兩個沒有后綴名的文件。
elf
在pyinstxtractor官方項目的wiki中有提到如何解壓elf,在此把第一種簡單的方法記錄下來(親測有效。
在wsl運行(同樣是當前目錄,這里文件名是main
cp /mnt/d/_CTF_/_Tools_/pyinstxtractor.py .
objcopy --dump-section pydata=easyRE.dump easyRE
python2 pyinstxtractor.py easyRE.dump
就多了第二行,這里是把elf里pydata段分離開,具體看官方解釋。
然后會在當前目錄下生成easyRE.dump_extracted文件夾,同樣是easyRE
(一般是解包提示是entry point的名字)和struct
有用。
補頭,將無后綴文件改為.pyc
原easyRE文件的開頭。
struct文件的開頭。
ctrl+shift+i -> 寫下要增加的字節數size,右邊value填0 -> 在struct文件里ctrl+c -> 回來光標在最開始時ctrl+v。
得到
這一步是將前面少了的文件頭部分插入到easyRE的開頭,形成新的二進制文件(不然會報錯Invalid pyc/pyo file - Magic value mismatch!
),並增加后綴名.pyc
。
(補充二進制數據的目的是為了保證Magic value能match上,具體原理自行搜索。
uncompyle6
最后在cmd輸入
uncompyle6 easyRE.pyc > easyRE.py
即可獲取easyRE.py
,有源代碼就能逆啦0v0。