[系统安全]《黑客免杀攻防》逆向基础之经典脱壳基础
本文為筆者從零基礎學習系統安全相關內容的筆記,如果您對系統安全、逆向分析等內容感興趣或者想要了解一些內容,歡迎關注。本系列文章將會隨著筆者在未來三年的讀研過程中持續更新,由于筆者現階段還處于初學階段,不可避免參照復現各類書籍內容,如書籍作者認為侵權請告知,筆者將立刻刪除。強調本系列所有內容僅作為學習研究使用,作者對此文章中的代碼造成的任何后果不負法律責任。
前文鏈接
[系統安全] PE文件格式詳解1
[系統安全] PE文件格式詳解2
[系統安全] Windbg Preview調試記錄
[系統安全]《黑客免殺攻防》MFC逆向基礎實戰
[系統安全] windows下C++編寫第一個加殼程序
[系統安全] PE文件格式分析實戰基礎—分析helloworld文件
本篇文章為《黑客免殺攻防》筆記,如書籍作者認為侵權請告知,筆者將立刻刪除。
文章目錄
- 什么是脫殼技術
- 第一步,尋找程序真正的OEP
- 利用跨區段跳轉獲取目標程序OEP
- 利用堆棧平衡獲取目標程序OEP
- 利用關鍵API定位OEP
- 第二步,轉儲內存映像dump
- 第三步,重建導入表(修復IAT)
什么是脫殼技術
前面學習了簡單的加殼技術,簡單通俗點來說,就是給定目標程序,先拿到它的OEP,然后對其代碼段(或者其他區段)加密或者壓縮等操作后,把自己寫的引導程序Stub融合進這個PE文件,并修改這個Stub最后要轉到的執行地址為剛才拿到的OEP,然后把這個PE文件的OEP修改為自己編寫的Stub程序的開始地址。
脫殼技術反過來,就是找到真正的程序OEP地址,然后讓程序執行到這個地址,然后dump下來,再根據具體情況進行修復。這個過程就是脫殼。
脫殼的第一步就是尋找程序的真正的OEP地址。
第一步,尋找程序真正的OEP
利用跨區段跳轉獲取目標程序OEP
原理是加殼程序通常會把加載模塊放到不同于原程序代碼段的另一個區段中,等程序運行時先運行這個加載模塊,最后跳轉到原程序代碼段,所以這是一個跨段并且地址相差比較大的跳轉。
這里以Demo13-1.exe程序為例,先用LordPE查看程序的區段信息。
可以看到多了一個.A1Pass段,這個應該就是編寫的Stub加載模塊部分。結合前面的加殼知識程序都會從代碼段開始執行,所以如果有從.A1Pass段向.text段跳轉,那么這個跳轉地址就很有可能就是原來的OEP。
把程序載入OD中,alt+M調出模塊界面,在.text段設置斷點。
然后按F9運行,停到對text段修改的地方,如下所示
然后再retn的地方F2下斷點,并取消剛才設置的text的寫斷點,重新運行程序,程序就停到了retn的地方,F8單步執行得到返回的地方,如下所示
可以看到再往下的位置有一處是跳轉到0x00401357,由上面LordPE中看到程序加載基址為0x00400000可知,實際地址為1357,也就是代碼段所在地址范圍。得出結論這個地址就是程序原來的OEP。
利用堆棧平衡獲取目標程序OEP
為了保證加殼之后的宿主程序能夠正常運行,會在Stub部分入口和出口都加上pushad和popad類指令,其作用是保存和恢復所有寄存器狀態。比如經典的upx殼就有這種特征。
于是有ESP定律:即可加殼程序開始運行時的棧狀態與解壓解密后宿主程序開始運行時的棧狀態完全一致,因此加殼程序開始運行時ESP的值與解壓解密后宿主程序開始運行時的ESP值完全一致。
以Demo13-2.exe程序為例,運行到pushad下一條指令時,右鍵在esp值處下硬件斷點。
再按F9執行到下次中斷時,查看附近匯編代碼,如下
可以看到retn之前的push 1357就是程序的OEP地址。
利用關鍵API定位OEP
不同編譯器的OEP附近調用的第一個api函數是不同,他們通常的作用是初始化或者獲取系統環境信息,而這些api在殼的Stub部分通常不會出現。所以可以借此來定位OEP,但需要注意的是這些api有時會被放在EOP附近比較深的函數調用棧里。下面記錄一些編譯器的關鍵api對照表。
| VC++6.0 | GetVersion |
| VC++7.1 (VS 2003) | msvcrt.__set_app_type |
| VC++8.0 (VS 2005) | GetSystemTimeAsFileTime |
| VC++9.0 (VS 2008) | GetSystemTimeAsFileTime |
| VC++10.0 (VS 2010) | GetSystemTimeAsFileTime |
第二步,轉儲內存映像dump
dump的前提是先要讓程序運行到程序原來的OEP的位置,然后再dump下來,這樣才能保證dump下來的可執行文件是被解密或者解壓之后的,并且執行時會執行所有的程序所需要的前備工作。
可是使用LordPE進行dump,但是這個軟件聽說好像只能顯示60個進程。win7以上開機貌似就不止60個進程了,所以獲取不到,這里使用OD的插件dump。依舊以Demo13-2.exe程序為例,讓再od里讓程序運行的OEP處。
默認選項保存為exe文件即可。
第三步,重建導入表(修復IAT)
在PE文件運行開始時,系統會先根據導入表內的導入模塊名和api函數名獲取相應的api的當前地址,并把這些地址按照相應的順序保存在IAT中。
等到程序運行時只需要IAT提供的api地址,因此如果有正確的IAT而沒有導入表也是可以的。
重建導入表就是從IAT信息逆向推出導入導出表,需要遍歷進程空間內所有已經加載的模塊的導出信息就能獲得重建導入表所需要的模塊和api信息,這就是重建導入表需要的所有信息。
使用ImportREC重建導入表
目前OD插件的dump功能可以自動修復IAT(導入地址表),但是這里還是做一下ImportREC的實驗。
要將目標文件完全脫殼,并停留在OEP處;而且還要OD先dump下來一份沒有修復的exe文件。
管理員打開,選擇od載入的正在執行的進程,寫入剛才獲取的oep,此時od也停留在程序的oep處。點擊自動搜索,然后點擊獲取輸入表
可以看到顯示有效,然后點擊修復轉存文件,選擇剛才dump下來的那個沒有修復并且無法運行的exe文件即可。
ps:逆向這條路也很長,不知道自己能走多遠。可能會一直走下去,也可能最后會重新回到滲透的方向上。
總結
以上是生活随笔為你收集整理的[系统安全]《黑客免杀攻防》逆向基础之经典脱壳基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 校园创业计划书
- 下一篇: 一步步学习SPD2010--第八章节--