2013-11-26 82 views
0

關於這個問題有很多話題,但我找不到我在所找到的所有主題中找到的答案。堆棧框架破壞

我實際的問題是:

當我們進入一個過程,我們才能繼續使用,無需任何泄漏正常運行的程序使用功能序言和跋(進入和離開的指令)。

假設你想在程序中使用2個局部變量。您可以將ESP減少8,以將對齊默認爲4個字節(DWORD)。在程序結束時,您希望DESTROY/RELEASE這些變量,因此您必須將ESP設置爲EBP。

我的問題是,如何改變ESP地址等於EBP地址銷燬/釋放局部變量?我們調用RET之後會發生什麼?堆棧框架如何被銷燬?

+1

到底是什麼「破壞」與「放」在你心目中意味着什麼呢?你是否想象着小小的管理員走進你的內存,拾取小的舊變量並將它們釋放回野外? –

回答

2

第一個問題:ESP是一個指向堆棧頂部的指針,因此如果在過程結束時將8添加到ESP,那麼您將減少堆棧。存儲在本地字段中的內存不再位於堆棧中,因此可以根據需要進行更改。第二個問題:RET命令執行兩件事:它將控制權返回給主程序,但以更技術性的方式 - 從堆棧頂部讀取數字並將其寫入指令指針EIP寄存器。 還值得明知CALL指令做兩件事情 - 它推下一個訂單的地址到堆棧,然後跳轉到程序 - 這意味着RET知道在哪裏可以跳回

2

的收場白功能如下:

mov %esp, %ebp 
pop %ebp 
ret 

或(在x86上,在那裏休假做同樣的事情與上面第一個2行)

leave 
ret 

回答你的問題:

-in指令休假的第一部分,我們設定德%EBP等於%ESP

-as我們稱之爲「退役」,PC(程序計數器)的值設置爲地址通過彈出堆棧頂部的「調用」指令旁邊的指令。

-the堆棧幀「破壞」爲我們設定的新值%ESP(ESP%+ 4)