近期工作中需要逆向分析一個神奇的木馬,文件看起來是一個linux下面的elf文件,但是通過常規(guī)手段用ida或者ghidra分析完全沒有頭緒(主要是因為菜>_<),但是通過ida的分析可以看出明顯的python痕跡,后來通過萬能的谷歌學習到,還有另一種途徑可以完美的逆向python打包的可執(zhí)行程序。本文簡要記錄一下逆向python打包的elf/exe程序的逆向分析方法。
python打包的可執(zhí)行程序
將python腳本打包成可執(zhí)行程序可以更方便的在目標平臺上執(zhí)行,打包工具有很多,其中最常用的當數(shù)pyinstaller了,在Linux/Windows平臺上可以通過pip安裝:
pip install pyinstaller
打包方法很簡單,直接對寫好的python程序demo.py執(zhí)行:
pyinstaller -F demo.py
打包好的exe程序會在dist目錄中,elf需要在Linux下打包,方法是一樣的
pyinstaller打包可執(zhí)行程序的特征
接下來分析一下用ida打開打包好的elf/exe有什么特征,將exe拖到ida中分析。
- main函數(shù)特征
首先在函數(shù)窗口可以找到main方法,雙擊打開然后上F5大法
下圖中標注了幾條main中比較明顯的特征,猜測應(yīng)該是pyinstaller打包的一種固定模式代碼

- 字符串特征
按shift+F12查看變量(本例中,想在這里找到程序中的密碼是不可能的),可以看到很多Py開頭的文件,這也是為什么我開始猜測這個elf文件是由python打包的

反編譯可執(zhí)行文件
從ida的內(nèi)容分析似乎很難找到真正的程序邏輯入口在哪里,后來在谷歌一番搜索終于找到的正確方向。反編譯首先要用python(我用python3.7)自帶的archive_viewer.py將elf/exe程序提取出pyc文件,然后再從pyc反編譯成py
- 提取pyc文件
windows下的archive_viewer.py文件目錄在{Python_Home}\Lib\site-packages\PyInstaller\utils\cliutils,將這個文件復(fù)制到工作目錄下,執(zhí)行如下命令:
python archive_viewer.py demo

這里看到分析出目標程序的模塊,其中唯一一個不帶前綴后綴的就是我們要找的模塊
接下來提取該模塊x client-update,提取后的文件如下圖所示:

- 修改文件頭
使用pyinstaller打包的文件,文件頭的數(shù)據(jù)會被抹消掉。再還原的過程中,我們需要手動進行修補。文件頭的格式為:magic(4字節(jié),編譯器標志) + 時間戳(4字節(jié))。在實際修補時,需要添加的數(shù)據(jù)可能不止是8個字節(jié)。(筆者python版本為3.7,需要填充16個字節(jié))以下為修補的步驟
承接上面的步驟,除了要提取目標文件.pyc以外,還需要再提一個struct文件:

使用二進制編輯工具打開這兩個文件,對比發(fā)現(xiàn),提取出的目標文件頭部比struct.pyc少了8個字節(jié)
[圖片上傳失敗...(image-bb5cab-1626878121733)]
接下來需要將缺失的部分補全,將struct.pyc頭部的8個字節(jié)內(nèi)容拷貝到目標文件頭部,然后保存文件

-
反編譯pyc文件
這里需要安裝
uncompyle6pip install uncompyle6安裝后的可執(zhí)行程序在
{Python_Home}/Scripts}下,可以直接執(zhí)行:uncompyle6.exe client-update.pyc > client-update.py
可以看到最后反編譯的結(jié)果非常清晰可讀

原文鏈接: 反編譯Python打包的可執(zhí)行程序