您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何使用ESP技巧進(jìn)行解包可執(zhí)行文件,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
加殼與解包
加殼軟件可以幫助你對(duì)可執(zhí)行文件進(jìn)行壓縮,就跟zip文件差不多。一般來(lái)說(shuō),當(dāng)你在使用zip文件時(shí),需要手動(dòng)進(jìn)行解壓縮。但是對(duì)于加殼來(lái)說(shuō),它會(huì)在可執(zhí)行文件的代碼中添加一部分不會(huì)被壓縮的“運(yùn)行時(shí)封裝器”代碼。當(dāng)你運(yùn)行這個(gè)可執(zhí)行文件時(shí),這部分未被封裝的代碼將會(huì)對(duì)可執(zhí)行文件中其他已被封裝的惡意代碼進(jìn)行解包并運(yùn)行。
如何識(shí)別這種加殼的惡意軟件呢?其中一種方法就是檢查其中的字符串信息,但是加殼后的可執(zhí)行文件中并沒(méi)有大量字符串可以查看。你也可以對(duì)代碼中import的類和庫(kù)進(jìn)行分析,但加了殼的可執(zhí)行文件并不會(huì)顯示這部分內(nèi)容,這樣可以增加逆向分析的難度。因此,為了對(duì)加殼的惡意軟件成功進(jìn)行逆向分析,我們需要對(duì)其一直調(diào)試直到發(fā)現(xiàn)了未壓縮的代碼為止,然后對(duì)導(dǎo)出的可執(zhí)行文件代碼進(jìn)行分析。
這里可以使用“ESP技巧”,也就是ESP寄存器。我們可以利用這種技術(shù)在ESP寄存器中設(shè)置硬件斷點(diǎn),當(dāng)我們轉(zhuǎn)移到改斷點(diǎn)時(shí),也就是到達(dá)了程序的入口點(diǎn)(OEP)。接下來(lái),我們就可以將剩下的可執(zhí)行文件導(dǎo)出,并得到解包后的可執(zhí)行文件代碼了。
我們專門開(kāi)發(fā)了一個(gè)小程序來(lái)演示如何手動(dòng)解包可執(zhí)行文件,你可以點(diǎn)擊【這里】獲取。其實(shí)這就是一個(gè)奪旗小游戲,當(dāng)你找到了正確的密碼之后,你需要輸入并嘗試拿到Flag。你可以在Radare2中通過(guò)比對(duì)字符串?dāng)?shù)據(jù)來(lái)尋找到密碼,或者你也可以直接使用“strings”命令來(lái)搜索,但如果程序加了殼的話,又該怎么辦呢?因此,我們這里使用了免費(fèi)的UPX封裝器來(lái)對(duì)代碼進(jìn)行封裝加殼,它的解包過(guò)程也比較簡(jiǎn)單,所以它是一款非常適合學(xué)習(xí)的工具。祝大家好運(yùn)!
當(dāng)我們使用rabin2運(yùn)行封裝的可執(zhí)行程序并查看import信息時(shí),我們可以看到這里幾乎沒(méi)有什么信息,而且字符串也看不出什么字面意思:
$rabin2 -i UPX_Proj_Packed.exe [Imports] 0010x0040d03c NONE FUNC KERNEL32.DLL_LoadLibraryA 002 0x0040d040 NONE FUNC KERNEL32.DLL_ExitProcess 003 0x0040d044 NONE FUNCKERNEL32.DLL_GetProcAddress 0040x0040d048 NONE FUNC KERNEL32.DLL_VirtualProtect 0010x0040d050 NONE FUNC msvcrt.dll__iob $
很明顯,這是一個(gè)經(jīng)過(guò)封裝的程序。我們可以PEiD工具來(lái)查看它所使用的封裝器信息:
你可以看到,這里使用的是UPX封裝器。當(dāng)然了,這種封裝器拆封起來(lái)非常簡(jiǎn)單,你也可以直接下載UPX拆封程序來(lái)進(jìn)行解包。但我們這里要演示的是如何手動(dòng)實(shí)現(xiàn)這個(gè)過(guò)程,所以接下來(lái)我們?cè)趚64dbg中啟動(dòng)程序,然后按下F9,直到我們到達(dá)應(yīng)用程序的入口點(diǎn)位置。X64dbg會(huì)直接用“EntryPoint”對(duì)入口點(diǎn)進(jìn)行標(biāo)記,這里我們使用了pushal指令對(duì)入口點(diǎn)設(shè)置識(shí)別符。
下一步,我們需要按下F8或F7鍵,或者按下“step over”或“step into”按鈕。然后需要右鍵點(diǎn)擊右側(cè)的ESP寄存器,并選擇“Follow in Dump”。
接下來(lái),我們需要選擇x64dbg底部導(dǎo)出數(shù)據(jù)的前四個(gè)字節(jié),然后在DWord中設(shè)置一個(gè)硬件訪問(wèn)斷點(diǎn)。
接下來(lái),我們就可以按下F9鍵來(lái)重新運(yùn)行應(yīng)用程序了,當(dāng)運(yùn)行到硬件端點(diǎn)位置時(shí),程序?qū)和_\(yùn)行。我們?cè)跀帱c(diǎn)后設(shè)置了一個(gè)popal指令,并用它來(lái)表示我們?nèi)栽谡_的執(zhí)行路徑上。我們還可以看到,結(jié)尾部分跳轉(zhuǎn)到的0x0040c483就是解包后可執(zhí)行文件的結(jié)尾部分。
跳過(guò)jmp指令之后,我們就到達(dá)了程序的入口點(diǎn)位置。
下一步就是要對(duì)導(dǎo)出的應(yīng)用程序進(jìn)行分析了,按下CTRL+A鍵并開(kāi)始分析匯編代碼,這樣可以確保到處的匯編代碼不會(huì)出現(xiàn)錯(cuò)誤?,F(xiàn)在,我們可以按下CTRL+I鍵或在插件欄選擇Scylla來(lái)開(kāi)始導(dǎo)出程序。
現(xiàn)在,點(diǎn)擊“IAT Autosearch”按鈕來(lái)讓程序自動(dòng)幫我們找出可執(zhí)行程序的導(dǎo)入地址表(IAT)。點(diǎn)擊了“Get Imports”按鈕之后,我們將會(huì)得到這個(gè)可執(zhí)行文件引用的第三方庫(kù)。
現(xiàn)在,點(diǎn)擊“Dump”按鈕并保存導(dǎo)出的可執(zhí)行程序。但是當(dāng)我們運(yùn)行這個(gè)可執(zhí)行文件時(shí),卻出現(xiàn)了下圖所示的錯(cuò)誤:
這是因?yàn)榻獍蟮目蓤?zhí)行文件中不包含之前可執(zhí)行文件中的IAT,所以我們還需要對(duì)其進(jìn)行修復(fù)。返回Scylla界面,點(diǎn)擊“Fix Dump”按鈕,選擇剛才導(dǎo)出的可執(zhí)行文件,并點(diǎn)擊確定。修復(fù)成功后,可執(zhí)行文件的文件名后面會(huì)加上一個(gè)“SCY”,現(xiàn)在它就可以正常運(yùn)行了。
然后重新在Rabin2中打開(kāi)這個(gè)解包后的可執(zhí)行程序,并嘗試導(dǎo)出其中的設(shè)置信息。
如果你使用密碼“this_is_password”來(lái)運(yùn)行我們的應(yīng)用程序,你將會(huì)看到如下所示的界面:
恭喜你成功拿到了Flag!
以上就是如何使用ESP技巧進(jìn)行解包可執(zhí)行文件,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。