反編譯Python打包的可執(zhí)行程序

近期工作中需要逆向分析一個神奇的木馬,文件看起來是一個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中分析。

  1. main函數(shù)特征

首先在函數(shù)窗口可以找到main方法,雙擊打開然后上F5大法

下圖中標注了幾條main中比較明顯的特征,猜測應(yīng)該是pyinstaller打包的一種固定模式代碼

image-20210225223221890.png
  1. 字符串特征

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

image-20210225223510030.png

反編譯可執(zhí)行文件

從ida的內(nèi)容分析似乎很難找到真正的程序邏輯入口在哪里,后來在谷歌一番搜索終于找到的正確方向。反編譯首先要用python(我用python3.7)自帶的archive_viewer.py將elf/exe程序提取出pyc文件,然后再從pyc反編譯成py

  1. 提取pyc文件

windows下的archive_viewer.py文件目錄在{Python_Home}\Lib\site-packages\PyInstaller\utils\cliutils,將這個文件復(fù)制到工作目錄下,執(zhí)行如下命令:

python archive_viewer.py demo
image-20210225224909857.png

這里看到分析出目標程序的模塊,其中唯一一個不帶前綴后綴的就是我們要找的模塊

接下來提取該模塊x client-update,提取后的文件如下圖所示:

image-20210225225419108.png
  1. 修改文件頭

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

承接上面的步驟,除了要提取目標文件.pyc以外,還需要再提一個struct文件:

image-20210225225734159.png

使用二進制編輯工具打開這兩個文件,對比發(fā)現(xiàn),提取出的目標文件頭部比struct.pyc少了8個字節(jié)

[圖片上傳失敗...(image-bb5cab-1626878121733)]

接下來需要將缺失的部分補全,將struct.pyc頭部的8個字節(jié)內(nèi)容拷貝到目標文件頭部,然后保存文件

image-20210225230130177.png
  1. 反編譯pyc文件

    這里需要安裝uncompyle6

    pip install uncompyle6
    

    安裝后的可執(zhí)行程序在{Python_Home}/Scripts}下,可以直接執(zhí)行:

    uncompyle6.exe client-update.pyc > client-update.py
    

可以看到最后反編譯的結(jié)果非常清晰可讀

image-20210225231522152.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容