本文轉載自【微信公眾號:MicroPest,ID:gh_696c36c5382b】,經微信公眾號授權轉載,如需轉載與原文作者聯繫
應一位朋友之邀,對「吾愛論壇『ELF64手脫upx殼實戰』一文」進行了再重現,考慮到朋友他對原文過程理解不深,特抽空行文,著重對每個步驟、每個知識點進行了分解,現共享出來以回饋社會;同時此文對IDA遠程調試、編寫idc腳本有指導作用。
一、作者提供的樣本:
連結:
https://pan.baidu.com/s/1v_uL26C6FooLhHHSbPUhmQ
提取碼: ubmc、解壓密碼:52pojie.cn
樣本名:upx_linux;
二、分解過程
①在虛擬機裡上傳upx_linux樣本,放於root目錄下;虛擬機IP為192.168.152.138,下圖示:
確認樣本upx_linux是32位還是64位的程序?
readelf -a upx_linux,下圖可以看到為64位程序;
上圖為ELF文件頭,前四個字節為標識:7f 45 4c 46,意思就是:ELF,下圖:
第5個字節標識:為1,則32位;為2,則為64位;
這裡建議用010editor這個編輯器,它提供了很多腳本可以自動地識別出文件格式,能對當前欄位進行說明。
②上傳IDA服務端程序到虛擬機linux,因為我們要用IDA進行遠程調試,如圖:
因為這裡的文件是64位的,所以將linux_server64上傳到root目錄下;同理,如果是32位,就上傳linux_server,並將兩文件賦運行權限,因為要運行程序;
chmod +x linux_server64
chmod +x upx_linux
將linux_server64運行起來,
運行起來了,後端監聽23946埠;
下面開始ida遠程連接,如圖操作、配置:
如上圖這樣配好,OK完成;
③啟動代碼調試:
程序定位在了上圖入口處:44F058H,同下圖文件頭中的入口地址一致:
一直單步調試下去,來到這裡:
F7進入這個call;一直往下單步:
來到圖中位置,發現有三個向上的循環,直接在紅色位置下斷F2,按F9跳出三個循環,來到下斷處;
如上圖,這裡有個call,不用進去,F8過去;來到jmp的跳轉[r15],看看是什麼:
[r15]指向40000CH處,執行過去,
跳轉到40000CH處,注意看上圖,這不是ELF文件頭嘛(方框處),並在文件頭位置臨時放置代碼(橢圓處),很不正常啊!看來是跳轉語句,應該要到正常入口了,勝利在望!繼續執行,
來到了這裡,看著代碼,覺得舒服多了,這裡應該就是程序的正常入口OEP了,upx殼脫掉了。
下面就要將這些內存代碼dump出來,用作者提供的腳本;
執行完畢了,上圖為腳本輸出回顯窗口。已dump到文件中;將此dump文件上傳到linux中,運行正常,OK了。
三、IDC腳本的理解
作者的代碼寫得很清楚,紅筆框出來的代碼是重點,尤其是當你對RLF64文件頭格式不清楚時就覺得不太好理解;我這裡畫了張圖,結合idc代碼幫助理解。
關於ELF64位的文件頭,可以參看:
https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h#L220
也可以簡單點,看這個圖:
最好,還是要結合010editor載入的ELF文件,以及在動態調試中的ida的實際值來結合查看,這樣才能精準地理解ELF格式;如下圖,可以仔細品味品味。
分析到這裡就要結束了,內容很多,希望你能靜下心來慢慢消化,終將會有很大的收穫,也就不枉我的辛苦了
本文轉載自【微信公眾號:MicroPest,ID:gh_696c36c5382b】,經微信公眾號授權轉載,如需轉載與原文作者聯繫