逆向之函數棧幀結構分析
函數的簡介
- 函數的定義
計算機的函數,是一個固定的一個程序段,或稱其爲一個子程序,它在可以實現固定運算功能的同時,還帶有一個入口和一個出口。
- 函數的入口:
函數的入口,就是函數所帶的各個參數,我們可以通過這個入口,把函數的參數值代入子程序供計算機處理。
- 函數的出口:
函數的出口,就是指函數的函數值,在計算機求得之後,由此口帶回給調用它的程序
- 函數調用過程中的重要寄存器:
(1)EIP-程序計數器/pc指針,存儲的永遠是當前cpu正在執行指令的下一條指令
(2)EBP-幀指針,在函數的調用過程中存放了維護這個棧的棧底指針
(3)ESP-棧指針,在函數的調用過程中存放了維護這個棧的棧頂指針
函數棧幀
棧的生長:棧是由高地址向地地址的方向生長
棧的幀棧定義:棧有其棧頂和棧底,在x86系統的CPU中,寄存器ebp保存的是棧底地址稱爲幀指針,寄存器esp保存的是棧頂地址,稱爲棧指針
幀棧的變化: ebp一般由系統改變它的值,esp會隨着數據的入棧和出棧而移動,但esp始終指向棧頂
棧幀變化實例
棧幀變化過程
代碼