PWN菜雞入門之函數調用棧與棧溢出的聯系
阿新 • • 發佈:2019-02-03
sof cccccc ebp main函數 程序 spa last lock 實例
一、函數調用棧過程總結
Fig 1. 函數調用發生和結束時調用棧的變化
Fig 2. 將被調用函數的參數壓入棧內
Fig 3. 將被調用函數的返回地址壓入棧內
Fig 4. 將調用函數的基地址(ebp)壓入棧內,並將當前棧頂地址傳到 ebp 寄存器內
二、函數調用棧實例說明
首先我們來看看以下程序調用棧的過程:
int sum(int a,int b) { int temp = 0; temp = a+b; return temp; } int main() { int a = 10; int b = 20; int ret = 0; ret = sum(a,b); cout<<ret<<endl; ? return 0; }
如下調用過程:
每個函數在調用前都會做一件事情。
(1)把調用方的ebp入到自己的棧裏去
(2)用esp指向新的棧頂位置,把esp的值賦給ebp,產生新的ebp
(3)開辟空間,初始0XCCCCCCCC。 ebp入棧,實參入棧,形參入棧,調用call指令。call有兩步,把下一行指令的地址入棧,跳轉到調用的函數執行。形參內存主調方開辟,主調方釋放。
main函數棧幀
開辟sum函數棧幀
sum函數內存布局
三、函數調用棧在棧溢出中的難點
棧溢出的shellcode中經常會出現:
payload : padding1 + address of shellcode + padding2 + shellcode
payload: padding1 + address of system() + padding2 + address of “/bin/sh”
這幾種payload,很多教程對於padding2這個沒有解釋的很清楚,ctf wiki上是這樣說的 :“如果是正常調用 system 函數,我們調用的時候會有一個對應的返回地址 ”
PWN菜雞入門之函數調用棧與棧溢出的聯系