【reverse】逆向4 初識堆疊
【reverse】逆向4 初識堆疊
1、問題引入
假設我們需要一塊記憶體,有如下的要求
- 主要用於臨時儲存一些資料(如果資料很少可以放入暫存器中)
- 能夠記錄存了多少資料
- 能夠非常快速的找到某個資料
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個通用暫存器從堆疊中彈出,還原暫存器現場