4
對於作業分配,我正在執行一系列緩衝區溢出攻擊。我被給了一個反彙編程序,C語言中的源代碼用於不正確地調用gets()
的函數,以及我應該強制程序調用的其他幾個函數的源代碼。對於任務之一,我必須:如何使用緩衝區溢出攻擊替換堆棧上的返回地址
- 注入一些代碼,變化的值,然後
- 返回到上述方法
,我不明白,最主要的一個當確定程序返回時,程序在堆棧中查找。存儲在堆棧上的方法的返回地址在哪裏?
該程序是爲x86編譯的。
對於作業分配,我正在執行一系列緩衝區溢出攻擊。我被給了一個反彙編程序,C語言中的源代碼用於不正確地調用gets()
的函數,以及我應該強制程序調用的其他幾個函數的源代碼。對於任務之一,我必須:如何使用緩衝區溢出攻擊替換堆棧上的返回地址
,我不明白,最主要的一個當確定程序返回時,程序在堆棧中查找。存儲在堆棧上的方法的返回地址在哪裏?
該程序是爲x86編譯的。
你需要知道什麼:
當調用一個函數時,參數和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藝術上較低)
首先,您需要了解在x86機器代碼中的函數調用中發生了什麼。看看'call'和'ret'指令。如果你有這個,你可以嘗試瞭解一個堆棧幀是什麼。 –