1. 程式人生 > >PWN菜雞入門之函數調用棧與棧溢出的聯系

PWN菜雞入門之函數調用棧與棧溢出的聯系

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 函數,我們調用的時候會有一個對應的返回地址

因為不用考慮相應的getshell的結束,我們可以從之前的介紹得知這是main函數調用後的下一條指令的地址,也就是return完system後我們將要繼續執行的指令,也就是說如果我們還想繼續調用的話這個padding2可以放下一個要執行的地址。

PWN菜雞入門之函數調用棧與棧溢出的聯系