ESP定律原理是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比千山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式千山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋千山地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
疫情期間閑著也是閑著,在逆向某軟件時(shí)深入了解了下ESP定律,然后就想寫個(gè)文章記錄并分享下。
ESP定律又稱堆棧平衡定律,是應(yīng)用頻率最高的脫殼方法之一 ,不論是新手還是老手都經(jīng)常用到。據(jù)我所知,ESP定律是一位外國大牛發(fā)現(xiàn)的,但目前已無從考證(未找到相關(guān)資料)。
棧(stack)是內(nèi)存中分配的一段空間。 向一個(gè)棧插入新元素又稱作入(push)放到棧頂元素的上面,使之成為新的棧頂元素; 從一個(gè)棧刪除元素又稱作出棧(pop),它把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
相當(dāng)于高級(jí)語言中的函數(shù)調(diào)用。 當(dāng)執(zhí)行call指令時(shí),進(jìn)行兩步操作: 將下一條的指令的地址壓入棧中,再跳轉(zhuǎn)到該地址處。 相當(dāng)于:
push ip jmp near ptr 地址
與call指令相對(duì)應(yīng),將當(dāng)前的ESP寄存器中指向的地址出棧,然后跳轉(zhuǎn)到這個(gè)地址。 相當(dāng)于:
pop ip #ret pop IP pop CS #retf
這是我寫的一個(gè)帶殼的32位小程序,用來當(dāng)做esp定律應(yīng)用的一個(gè)示例。這是一個(gè)比較機(jī)械的方法,但可以對(duì)esp定律有一個(gè)感性的認(rèn)識(shí)。
首先用Exeinfo Pe查殼,發(fā)現(xiàn)是nspack殼。
接下來用od載入程序,單步步入后,如箭頭所示發(fā)現(xiàn)ESP寄存器變紅。
此時(shí)單擊右鍵選中該寄存器進(jìn)行數(shù)據(jù)窗口跟隨。然后選中數(shù)據(jù)窗口任意字符下硬件斷點(diǎn)(byte,word,dword均可)。
f9運(yùn)行后,f8連續(xù)單步步過找到OEP( 程序的入口點(diǎn) )。選中該地址單擊右鍵選中用OllyDump脫殼調(diào)試進(jìn)程,然后進(jìn)行脫殼(如果發(fā)現(xiàn)程序不能打開,可以試試勾選重建輸入表)。
接著用Exeinfo Pe查殼,殼已經(jīng)被去掉了。
首先,殼實(shí)質(zhì)上是一個(gè)子程序,它在程序運(yùn)行時(shí)首先取得控制權(quán)并對(duì)程序進(jìn)行壓縮。 同時(shí)隱藏程序真正的OEP。大多數(shù)病毒就是基于此原理,從而防止被殺毒軟件掃描。
殼的類型:
? 解壓->運(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.EDX 004E820D offset r1. EBX 0036C000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1. EDI 004E820D offset r1. EIP 004E820D r1.
然后是到OEP時(shí)各寄存器的情況
EAX 0072FFCC ECX 004E820D offset r1.EDX 004E820D offset r1. EBX 0036A000 ESP 0072FF74 EBP 0072FF80 ESI 004E820D offset r1. EDI 004E820D offset r1. EIP 00401500 r1.00401500
我們發(fā)現(xiàn)只有EIP和EAX寄存器的數(shù)值發(fā)生了變化,而EAX保存的是OEP的地址,這是什么原因呢?
由于在程序自解密或者自解壓過程中, 多數(shù)殼會(huì)先將當(dāng)前寄存器狀態(tài)壓棧, 如使用pushad, 而在解壓結(jié)束后, 會(huì)將之前的寄存器值出棧, 如使用popad. 因此在寄存器出棧時(shí), 往往程序代碼被恢復(fù), 此時(shí)硬件斷點(diǎn)觸發(fā)(這就是我們要下硬件斷點(diǎn)的原因),然后在程序當(dāng)前位置, 只需要一些單步操作, 就會(huì)到達(dá)正確的OEP位置.
我自己總結(jié)了一個(gè)比較小白的方法,那就是載入程序后只有esp寄存器內(nèi)容發(fā)生變化,那么這個(gè)程序多半可以用ESP定律(如有錯(cuò)誤多謝指正)。
幾乎全部的壓縮殼, 一些早期的加密殼 (這是在網(wǎng)上收集到的資料總結(jié)的,經(jīng)過我自己的實(shí)踐,基本準(zhǔn)確)。
看完上述內(nèi)容,你們掌握ESP定律原理是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!