1. 程式人生 > 其它 >【reverse】逆向4 初識堆疊

【reverse】逆向4 初識堆疊

【reverse】逆向4 初識堆疊

1、問題引入

假設我們需要一塊記憶體,有如下的要求

  1. 主要用於臨時儲存一些資料(如果資料很少可以放入暫存器中)
  2. 能夠記錄存了多少資料
  3. 能夠非常快速的找到某個資料

2、模擬堆疊

我們可以設計這樣的結構圖

top:棧頂

base:棧底

windows作業系統分配堆疊是從高地址向低地址分配

為了統一,我們也這樣模擬

壓入資料

第一種新增資料的方式(先存資料再改地址)

我們將ebx作為棧底,edx作為棧頂,記憶體編號都位0x19FF78

將AAAAAAAA資料存入棧中之後,將edx的記憶體編號減去4

可以看到0019FF74記憶體編號的資料已經改為了AAAAAAAA

第二種新增資料的方式(先改地址再存資料)

我們先把edx的地址減去4,用lea的方式

然後再給edx地址存入資料BBBBBBBB

可以看到0019FF70記憶體編號的資料已經改為了BBBBBBBB

彈出資料

第一種彈出資料的方式(先取資料再改地址)

我們把棧頂edx的資料取出到eax中

然後再讓edx的地址加4

可以看到eax中存入了BBBBBBBB這個資料

第二種彈出資料的方式(先改地址再取資料)

先讓edx的地址加4,再從edx-4的地址中取出資料

可以的看到eax中存入了AAAAAAAA這個資料

3、堆疊

在cpu中,有兩個暫存器,ebp、esp

我們使用作業系統時,作業系統將ebp當作棧底,esp當作棧頂

組合語言給我們封裝好了push和pop指令

我們push兩個資料進去,esp的地址減少了8,並且在堆疊視窗可以看到我們push的兩個值

同時可以看到我們的esp到了0019FF6C也就是儲存12345678數值的地址

我們再執行

可以看到eax和ecx的值都改變了

同時esp的位置也加了8,因為pop了兩個值

push

不允許push 8位暫存器

push 16位暫存器,esp地址-2

push 32位暫存器,esp地址-4

push 立即數,esp地址-4

push dword ptr ds:[0x0019FF6C] 壓入0x0019FF6C地址連續4位元組的資料,esp地址-4

push word ptr ds:[0x0019FF6C] 壓入0x0019FF6C地址連續2位元組的資料,esp地址-2

pop

pop 16位暫存器,esp地址+2

pop 32位暫存器,esp地址+4

pop dword ptr ds:[0x0019FFDC] 將0019FFDC連著的4位元組的資料改為被彈出的資料,esp地址+4

pop word ptr ds:[0x0019FFDC] 將0019FFDC連著的2位元組的資料改為被彈出的資料的後2位元組,esp地址+2

pushad

將8個通用暫存器存入堆疊中,方便修改工作

popad

將8個通用暫存器從堆疊中彈出,還原暫存器現場