2012-11-01 40 views
4

對於作業分配,我正在執行一系列緩衝區溢出攻擊。我被給了一個反彙編程序,C語言中的源代碼用於不正確地調用gets()的函數,以及我應該強制程序調用的其他幾個函數的源代碼。對於任務之一,我必須:如何使用緩衝區溢出攻擊替換堆棧上的返回地址

  • 注入一些代碼,變化的值,然後
  • 返回到上述方法

,我不明白,最主要的一個當確定程序返回時,程序在堆棧中查找。存儲在堆棧上的方法的返回地址在哪裏?

該程序是爲x86編譯的。

+2

首先,您需要了解在x86機器代碼中的函數調用中發生了什麼。看看'call'和'ret'指令。如果你有這個,你可以嘗試瞭解一個堆棧幀是什麼。 –

回答

13

你需要知道什麼:

  • EIP是指向下一個指令執行的寄存器。
  • 當調用一個函數時,參數和EIP(所以被調用函數知道返回的位置)保存在堆棧中。當編譯器被告知(顯式或隱式地)使用幀指針時,它然後將棧指針(在EBP寄存器中)保存在堆棧上(以便它可以稍後將幀指針恢復到它所具有的值在調用函數上),然後將幀指針設置爲指向堆棧的當前頂部。這允許從已知參考點(幀指針)輕鬆訪問參數和局部變量,並且極大地簡化了調試。

  • 然後,爲局部變量保留空間,並執行該功能。
  • 從函數返回時,前一幀指針和指令指針被恢復。

x86上的函數調用看起來是這樣的:

         ... 
int main()        add $-0x8,%esp ; alignment 
{          push $0x2  ; arg 2 
     ...        push $0x1  ; arg 1 
     func(1, 2);      call func  ; function call 
     ...        add $0x10,%esp ; pop args from stack 
}          ... 

和被調用函數看起來是這樣的:

void func(int arg1, int arg2)   push %ebp  ;\ 
{          mov %esp,%ebp ;/ create stack frame 
     int local1;      sub $0x18,%esp ; reserves space 
     ...        ... 
}          mov %ebp,%esp ;\ 
             pop %ebp  ;/ destroys frame 
             ret    ; returns 

因此,堆棧將類似於:

  :   : 
      +-----------+ 
      : alignment : 
      +-----------+ 
12(%ebp) | arg2 | 
      +-----------+ 
8(%ebp) | arg1 | 
      +-----------+ 
4(%ebp) | ret | -----> return address 
      +-----------+ 
    (%ebp) | ebp | -----> previous ebp 
      +-----------+ 
-4(%ebp) | local1 | -----> local vars 
      +-----------+ 
      : alignment : 
      +-----------+ 
      :   : 

(低位地址在ASCII藝術上較低)

相關問題