esp定律手动nspack 3.7_ESP定律原理详解
原創(chuàng)作者: 青空
本文涉及知識(shí)點(diǎn)靶場(chǎng)練習(xí)——利用ESP定律進(jìn)行脫殼: 理解ESP原理的操作機(jī)理并掌握使用ESP原理進(jìn)行脫殼的流程。
實(shí)驗(yàn):利用ESP定律進(jìn)行脫殼(合天網(wǎng)安實(shí)驗(yàn)室)?www.hetianlab.com0x00 前言
疫情期間閑著也是閑著,在逆向某軟件時(shí)深入了解了下ESP定律,然后就想寫(xiě)個(gè)文章記錄并分享下。
ESP定律又稱(chēng)堆棧平衡定律,是應(yīng)用頻率最高的脫殼方法之一 ,不論是新手還是老手都經(jīng)常用到。據(jù)我所知,ESP定律是一位外國(guó)大牛發(fā)現(xiàn)的,但目前已無(wú)從考證(未找到相關(guān)資料)。0x01 前置知識(shí)
棧
棧(stack)是內(nèi)存中分配的一段空間。 向一個(gè)棧插入新元素又稱(chēng)作入(push)放到棧頂元素的上面,使之成為新的棧頂元素; 從一個(gè)棧刪除元素又稱(chēng)作出棧(pop),它把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。call
相當(dāng)于高級(jí)語(yǔ)言中的函數(shù)調(diào)用。 當(dāng)執(zhí)行call指令時(shí),進(jìn)行兩步操作: 將下一條的指令的地址壓入棧中,再跳轉(zhuǎn)到該地址處。 相當(dāng)于:
push ip jmp near ptr 地址ret && retf
與call指令相對(duì)應(yīng),將當(dāng)前的ESP寄存器中指向的地址出棧,然后跳轉(zhuǎn)到這個(gè)地址。 相當(dāng)于:pop ip #ret pop IP pop CS #retf0x02 操作示例
這是我寫(xiě)的一個(gè)帶殼的32位小程序,用來(lái)當(dāng)做esp定律應(yīng)用的一個(gè)示例。這是一個(gè)比較機(jī)械的方法,但可以對(duì)esp定律有一個(gè)感性的認(rèn)識(shí)。
首先用Exeinfo Pe查殼,發(fā)現(xiàn)是nspack殼。
接下來(lái)用od載入程序,單步步入后,如箭頭所示發(fā)現(xiàn)ESP寄存器變紅。
此時(shí)單擊右鍵選中該寄存器進(jìn)行數(shù)據(jù)窗口跟隨。然后選中數(shù)據(jù)窗口任意字符下硬件斷點(diǎn)(byte,word,dword均可)。
f9運(yùn)行后,f8連續(xù)單步步過(guò)找到OEP( 程序的入口點(diǎn) )。選中該地址單擊右鍵選中用OllyDump脫殼調(diào)試進(jìn)程,然后進(jìn)行脫殼(如果發(fā)現(xiàn)程序不能打開(kāi),可以試試勾選重建輸入表)。
接著用Exeinfo Pe查殼,殼已經(jīng)被去掉了。
0x03 原理詳解
首先,殼實(shí)質(zhì)上是一個(gè)子程序,它在程序運(yùn)行時(shí)首先取得控制權(quán)并對(duì)程序進(jìn)行壓縮。 同時(shí)隱藏程序真正的OEP。大多數(shù)病毒就是基于此原理,從而防止被殺毒軟件掃描。
殼的類(lèi)型:
? 解壓->運(yùn)行 ? 解壓->運(yùn)行->解壓.->運(yùn)行 ? 解壓 decoder|encoded code->decode ->exc ? Run the virtual machine而脫殼的目的就是找到真正的OEP(入口點(diǎn))。
而我們所講到的ESP定律的本質(zhì)是堆棧平衡,具體如下:
讓我們看下加了殼的這個(gè)小程序的入口的各個(gè)寄存器的情況
EAX 00000000 ECX 004E820D offset r1.<ModuleEntryPoint> EDX 004E820D offset r1.<ModuleEntryPoint> EBX 0036C000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1.<ModuleEntryPoint> EDI 004E820D offset r1.<ModuleEntryPoint> EIP 004E820D r1.<ModuleEntryPoint>然后是到OEP時(shí)各寄存器的情況
EAX 0072FFCC ECX 004E820D offset r1.<ModuleEntryPoint> EDX 004E820D offset r1.<ModuleEntryPoint> EBX 0036A000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1.<ModuleEntryPoint> EDI 004E820D offset r1.<ModuleEntryPoint> EIP 00401500 r1.00401500我們發(fā)現(xiàn)只有EIP和EAX寄存器的數(shù)值發(fā)生了變化,而EAX保存的是OEP的地址,這是什么原因呢?
由于在程序自解密或者自解壓過(guò)程中, 多數(shù)殼會(huì)先將當(dāng)前寄存器狀態(tài)壓棧, 如使用pushad, 而在解壓結(jié)束后, 會(huì)將之前的寄存器值出棧, 如使用popad. 因此在寄存器出棧時(shí), 往往程序代碼被恢復(fù), 此時(shí)硬件斷點(diǎn)觸發(fā)(這就是我們要下硬件斷點(diǎn)的原因),然后在程序當(dāng)前位置, 只需要一些單步操作, 就會(huì)到達(dá)正確的OEP位置.0x04 適用范圍
我自己總結(jié)了一個(gè)比較小白的方法,那就是載入程序后只有esp寄存器內(nèi)容發(fā)生變化,那么這個(gè)程序多半可以用ESP定律(如有錯(cuò)誤多謝指正)。
幾乎全部的壓縮殼, 一些早期的加密殼 (這是在網(wǎng)上收集到的資料總結(jié)的,經(jīng)過(guò)我自己的實(shí)踐,基本準(zhǔn)確)。
0x05 總結(jié)
以上就是我對(duì)ESP定律的理解,如有錯(cuò)誤,請(qǐng)輕噴 ^-^ ,我也還只一只剛邁入二進(jìn)制世界的菜鳥(niǎo),希望我這篇文章對(duì)剛?cè)腴T(mén)的小白有所幫助>_<
最后再加一句找OEP不是最難的,最難的還是修復(fù)。如果對(duì)OEP的識(shí)別有所疑惑可以問(wèn)我也可以在網(wǎng)上收集相關(guān)資料,還是比較多的。
聲明:筆者初衷用于分享與普及網(wǎng)絡(luò)知識(shí),若讀者因此作出任何危害網(wǎng)絡(luò)安全行為后果自負(fù),與合天智匯及原作者無(wú)關(guān)!
總結(jié)
以上是生活随笔為你收集整理的esp定律手动nspack 3.7_ESP定律原理详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 岚图汽车:岚图梦想家电动 MPV 限时补
- 下一篇: code换取微信openid_微信授权登