欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

EBP的妙用[無法使用ESP定律時]

系統(tǒng) 1960 0

1.了解EBP寄存器

在寄存器里面有很多寄存器雖然他們的功能和使用沒有任何的區(qū)別,但是在長期的編程和使用 中,在程序員習(xí)慣中已經(jīng)默認(rèn)的給每個寄存器賦上了特殊的含義,比如:EAX一般用來做返回值,ECX用于記數(shù)等等。在win32的環(huán)境下EBP寄存器用與 存放在進入call以后的ESP的值,便于退出的時候回復(fù)ESP的值,達(dá)到堆棧平衡的目的。

應(yīng)用以前說過的一段話:

原程序的OEP,通常是一開始以 Push EBP 和MOV Ebp,Esp這兩句開始的,不用我多說大家也知道這兩句的意思是以EBP代替ESP,作為訪問堆棧的指針。

為什么要這樣呢?為什么幾乎每個程序都是的開頭能?因為如果我們寫過C等函數(shù)的時候就應(yīng)該清楚,程序的開始是以一個主函數(shù)main()為開始的,而函數(shù)在訪問的過程中最重要的事情就是要確保堆棧的平衡,而在win32的環(huán)境下保持平衡的辦法是這樣的:

1.讓EBP保存ESP的值;

2.在結(jié)束的時候調(diào)用

              mov esp,ebp 

pop ebp 

retn
            

或者是

              leave

retn
            


兩個形式是一個意思。

這樣做的好處是不用考慮ESP等于多少,PUSH了多少次,要POP多少次了,因為我們知道EBP里面放的是開始時候的ESP值。

2.推廣的ESP定律

在尋找OEP的時候,往往下斷HW ESP-4不成功,除了殼代碼將硬件斷點刪除了以外,很可能的情況就是因為殼代碼在運行到OEP的時候他的ESP已經(jīng)不再是在EP時候的ESP(12FFC4)了,這樣我們下斷當(dāng)然是不成功的。

那么如何找到在殼到達(dá)OEP的時候的堆棧的值將是關(guān)鍵。

在這里我們應(yīng)用的關(guān)鍵是

              Push EBP

MOV Ebp,Esp----》關(guān)鍵是這句
            

我來解釋一下,當(dāng)程序到達(dá)OEP的時候Push EBP這句對于ESP的值來說就是ESP-4,然后是ESP-4賦給了EBP,而做為保存ESP值作用的EBP寄存器在這個“最上層的程序”中的值將始終 不會改變。雖然他可能在進入子call里面以后會暫時的改變(用于子程序的堆棧平衡)但是在退出了以后依*pop ebp這一句將還原原來的EBP的值。

以這句做為突破口,就是說只要我們能斷在“最上層的程序”中,就能通過觀察EBP的值得到殼在JMP到OEP的時候的ESP的值了。

3.實戰(zhàn)

來看看pespin1.1的殼,在pespin1.0的殼中,我們使用HW 12FFC0能很容易的找到stolen code的地方,但是到pespin1.1的時候,我們就不行了。用HW 12FFC0根本斷不下來。

現(xiàn)在我們就使用這個推廣的ESP定律,載入程序后來到最后的一個異常

              0040ED85     2BDB             sub ebx,ebx                           //停在這里

0040ED87     64:8F03          pop dword ptr fs:[ebx]

0040ED8A     58               pop eax

0040ED8B     5D               pop ebp

0040ED8C     2BFF             sub edi,edi

0040ED8E     EB 01            jmp short pespin1_.0040ED91

0040ED90     C466 81          les esp,fword ptr ds:[esi-7F]
            

我用使用內(nèi)存斷點辦法來到FOEP處

              004010D3     0000             add byte ptr ds:[eax],al

004010D5     0000             add byte ptr ds:[eax],al

004010D7     0000             add byte ptr ds:[eax],al

004010D9     0000             add byte ptr ds:[eax],al

004010DB     0000             add byte ptr ds:[eax],al

004010DD     0000             add byte ptr ds:[eax],al

004010DF     75 1B            jnz short pespin1_.004010FC               //這里是FOEP

004010E1     56               push esi 

004010E2     FF15 99F44000    call dword ptr ds:[40F499]

004010E8     8BF0             mov esi,eax

004010EA     8A00             mov al,byte ptr ds:[eax]
            


好了,這里就是“最上層的程序”的地方了,看看寄存器

              EAX 00141E22

ECX 0040C708 pespin1_.0040C708

EDX 0040C708 pespin1_.0040C708

EBX 0040C708 pespin1_.0040C708                    

ESP 0012F978

EBP 0012F9C0                                  //注意這里

ESI 00141EE0

EDI 0040E5CD pespin1_.0040E5CD

EIP 004010DF pespin1_.004010DF
            

看到了吧,EBP=0012F9C0,我們來想象一下這個值是怎么得到的。

首先肯定是通過MOV ESP,EBP這一句,也就是說ESP這時是0012F9C0的,然而上面還有一句PUSH EBP也就是說ESP在到達(dá)OEP的時候應(yīng)該是0012F9C4的。好了得到這個結(jié)論我們就能很快的找到stolen code的所在了。

重來停在最后的異常

              0040ED85     2BDB             sub ebx,ebx                           //停在這里

0040ED87     64:8F03          pop dword ptr fs:[ebx]

0040ED8A     58               pop eax

0040ED8B     5D               pop ebp

0040ED8C     2BFF             sub edi,edi

0040ED8E     EB 01            jmp short pespin1_.0040ED91

0040ED90     C466 81          les esp,fword ptr ds:[esi-7F]
            

然后下斷HW 0012F9C0 ,F(xiàn)9運行,來到這里

              0040D8FB     61               popad

0040D8FC     55               push ebp

0040D8FD     EB 01            jmp short pespin1_.0040D900           //停在這里

0040D8FF     318B ECEB01AC    xor dword ptr ds:[ebx+AC01EBEC],ecx

0040D905     83EC 44          sub esp,44

0040D908     EB 01            jmp short pespin1_.0040D90B

0040D90A     72 56            jb short pespin1_.0040D962

0040D90C     EB 01            jmp short pespin1_.0040D90F

0040D90E     95               xchg eax,ebp

0040D90F     FF15 6CF34000    call dword ptr ds:[40F36C]

0040D915     EB 01            jmp short pespin1_.0040D918
            

于是就很快的找到了stolen code的所在了。

4.總結(jié)

上面的這個辦法大概可以總結(jié)以下的步驟:

(1).直接或間接的斷在“最上層的程序”的地方。

(2).得到“最上層的程序”的EBP的值。

(3).利用程序初始化的兩個固定語句找到殼JMP到OEP的堆棧值。這個辦法有很大的局限性,因為只有VC和delphi程序使用這個初始化的開頭。

但是找到“最上層的程序”的辦法除了內(nèi)存斷點還有很多辦法,例如對于VC來說使用 bp ExitProcess也是一個很好的斷點,可以直接得到EBP的數(shù)值。

5.后話

原來這個辦法有很強的前提條件,不是一個很具普遍性的辦法,我原來也不想單獨的提出來,但是對于jney2兄弟的anti-ESP定律來說這個辦法卻是一個解決之道。

當(dāng)然還有更多的辦法,在這里我只想說很多事情有矛就有盾,沒有什么辦法是一定沒有漏洞的,只是希望這篇文章給大家闊寬思路,起到拋磚引玉的作用。

EBP的妙用[無法使用ESP定律時]


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久视频在线 | 欧美黄网在线 | 嫩草影院在线观看网站成人 | 国产精品毛片无码 | 久草日韩| 波多野结衣中文在线播放 | 欧日韩不卡在线视频 | 婷婷的久久五月综合先锋影音 | 色屁屁www影院入口免费观看 | 久草在线在线观看 | 成人一区二区在线观看视频 | 欧美性喷潮xxxx| 亚洲韩国精品 | 精品国内在线视频2019百度 | 自拍偷拍视频网站 | 成人欧美一区二区三区黑人3p | 女人叉开腿让男人桶 | 毛片啪啪啪| av一区二区三区四区 | 99热这里只有精品国产99 | 蜜桃精品噜噜噜成人av | 国产精品爱久久久久久久电影 | 亚洲av毛片成人精品 | 成在线人免费视频 | 九色com | 久久久久久久久97 | 一级毛片观看 | 亚洲视频区 | www.久久 | 久久夜夜操妹子 | 中文字幕一区二区三区乱码图片 | 久久艹免费视频 | 性少妇videosexfreexx | 在线观看中文字幕 | 草草影院永久地址 | 午夜大片 | 免费一级毛片麻豆精品 | 天堂久久久久久中文字幕 | 亚拍自拍 | 91青青草视频在线观看 | 香港三级午夜理伦三级 |