esp定律

esp定律,是計算機用語,意思是向堆疊中壓入下一行程式的地址。

call

這個命令是訪問子程式的一個彙編基本指令。也許你說,這個我早就知道了!別急請繼續看完。

call真正的意義是什麼呢?我們可以這樣來理解:1.向堆疊中壓入下一行程式的地址;2.JMP到call的子程式地址處。例如:

00401029 . E8 DA240A00 call 004A3508

0040102E . 5A pop edx

在執行了00401029以後,程式會將0040102E壓入堆疊,然後JMP到004A3508地址處!

RET

與call對應的就是RET了。對於RET我們可以這樣來理解:1.將當前的ESP中指向的地址出棧;2.JMP到這個地址。

堆疊平衡原理

如果要返回父程式,則當我們在堆疊中進行堆疊的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入棧中的地址。

狹義ESP定律

ESP定律的原理就是“堆疊平衡”原理。

1.這個是加了UPX殼的入口時各個暫存器的值!

EAX 00000000

ECX 0012FFB0

EDX 7FFE0304

EBX 7FFDF000

ESP 0012FFC4

EBP 0012FFF0

ESI 77F51778 ntdll.77F51778

EDI 77F517E6 ntdll.77F517E6

EIP 0040EC90 note-upx.<ModuleEntryPoint>

C 0 ES 0023 32bit 0(FFFFFFFF)

P 1 CS 001B 32bit 0(FFFFFFFF)

A 0 SS 0023 32bit 0(FFFFFFFF)

Z 0 DS 0023 32bit 0(FFFFFFFF)

S 1 FS 0038 32bit 7FFDE000(FFF)

T 0 GS 0000 NULL

D 0

O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)

2.這個是UPX殼JMP到OEP後的暫存器的值!

EAX 00000000

ECX 0012FFB0

EDX 7FFE0304

EBX 7FFDF000

ESP 0012FFC4

EBP 0012FFF0

ESI 77F51778 ntdll.77F51778

EDI 77F517E6 ntdll.77F517E6

EIP 004010CC note-upx.004010CC

C 0 ES 0023 32bit 0(FFFFFFFF)

P 1 CS 001B 32bit 0(FFFFFFFF)

A 0 SS 0023 32bit 0(FFFFFFFF)

Z 1 DS 0023 32bit 0(FFFFFFFF)

S 0 FS 0038 32bit 7FFDE000(FFF)

T 0 GS 0000 NULL

D 0

O 0 LastErr ERROR_MOD_NOT_FOUND (0000007E)

以上數據可看出除了EIP不同以外,其他都一模一樣,現在我們來看看UPX的殼的第一行:

0040EC90 n> 60 pushad //****注意這裡*****

0040EC91 BE 15B04000 mov esi,note-upx.0040B015

PUSHAD就是把所有暫存器壓棧!我們在到殼的最後看看:

0040EE0F 61 popad //****注意這裡*****

0040EE10 - E9 B722FFFF jmp note-upx.004010CC //JMP到OEP

POPAD就是將所有暫存器出棧!

而當我們PUSHAD的時候,ESP將暫存器壓入了0012FFC0--0012FFA4的堆疊中!如下:

0012FFA4 77F517E6 返回到 ntdll.77F517E6 來自 ntdll.77F78C4E //EDI

0012FFA8 77F51778 返回到 ntdll.77F51778 來自 ntdll.77F517B5 //ESI

0012FFAC 0012FFF0 //EBP

0012FFB0 0012FFC4 //ESP

0012FFB4 7FFDF000 //EBX

0012FFB8 7FFE0304 //EDX

0012FFBC 0012FFB0 //ECX

0012FFC0 00000000 //EAX

對ESP的0012FFA4下硬體訪問斷點。也就是說當程式要訪問這些堆疊,從而恢復原來暫存器的值,準備跳向苦苦尋覓的OEP的時候,OD幫助我們中斷下來。

於是我們停在0040EE10這一行!

總結:我們可以把殼假設為一個子程式,當殼把代碼解壓前和解壓後,他必須要做的是遵循堆疊平衡的原理,讓ESP執行到OEP的時候,使ESP=0012FFC4。

廣義ESP定律

對只要在0012FFC0下,硬體寫入斷點,我們就能停在OEP的第二句處!!

下面我們來舉個例子,就脫殼進階第一篇吧!

載入OD後,來到這裡:

0040D042 N> B8 00D04000 mov eax,Notepad.0040D000 //停在這裡

0040D047 68 4C584000 push Notepad.0040584C

0040D04C 64:FF35 00000000 push dword ptr fs:[0] //第一次硬體中斷,F9

0040D053 64:8925 00000000 mov dword ptr fs:[0],esp

0040D05A 66:9C pushfw

0040D05C 60 pushad

0040D05D 50 push eax

直接對0012FFC0下硬體寫入斷點,F9運行。(注意硬體中斷)

在0040D04C第一次硬體中斷,F9繼續!

0040D135 A4 movs byte ptr es:[edi],byte ptr ds:[esi] //訪問異常,不管他 shift+F9繼續

0040D136 33C9 xor ecx,ecx

0040D138 83FB 00 cmp ebx,0

0040D13B ^ 7E A4 jle short Notepad.0040D0E1

第二次硬體中斷。

004058B5 64 db 64 //斷在這裡

004058B6 89 db 89

004058B7 1D db 1D

004058B8 00 db 00

004058B9 00 db 00

這裡也不是,F9繼續!

004010CC /. 55 push ebp

004010CD |. 8BEC mov ebp,esp //斷在這裡,到了!(如果發現有花指令,用ctrl+A分析一下就能顯示出來)

004010CF |. 83EC 44 sub esp,44

004010D2 |. 56 push esi

適用範圍

幾乎全部的壓縮殼,部分加密殼。只要是在JMP到OEP後,ESP=0012FFC4的殼,理論上我們都可以使用。但是在何時下斷點避開校驗,何時下斷OD才能斷下來,這還需要多多總結和多多積累。

相關詞條

熱門詞條

聯絡我們