## 2.2 棧
在開發調試器的時候,棧是一個非常重要的結構。棧存儲了與函數調用相關的各種信息, 包括函數的參數和函數執行完成后返回的方法。 ESP 負責跟蹤棧頂,EBP 負責跟蹤棧底。 棧從內存的高地址像低地址增長。讓我們用前面編寫的函數 my_sock()作為例子講解棧是如 何工作的。
Function Call in C
```
int my_socks(color_one, color_two, color_three);
```
Function Call in x86 Assembly
```
push color_three
push color_two
push color_one
call my_socks
```
棧框架的結構將如圖 2-1。

圖 2-1: my_socks() 函數調用的棧結構
如你所見,這是一個非常簡單的數據結構,同時也是所有程序中函數調用的基礎。當 my_sock()函數返回的時候,它會彈出棧里所有的參數(返回地址彈到 EIP),然后跳到返回 地址(Return address)指向的地方(父函數的代碼段)繼續執行。另一個需要考慮的概念就是 本地函數。把我們的 my_socks()函數擴展一點,讓我們假定函數被調用后做的第一件事就是 申請一個字符串數組,將參數 color_one 復制到數組里。代碼應該像這樣:
```
int my_socks(color_one, color_)
{
char stinky_sock_color_on[10];
...
}
```
函數將在棧里申請 stinky_sock_color_on 變量的空間,以便在棧里調用(當然會隨著函 數的執行完畢而釋放,不過在函數內部訪問時,效率會高很多)。申請成功以后,堆棧的結 構將像圖 2-2 看到的這樣。

Figure 2-2: 在 stinky_sock_color_one 申請后的棧框架
現在你到了本地函數是如何在棧里申請的以及棧指針是如何不斷的增長指向棧頂 的。調試器對堆棧結構的捕捉能力是相當有用的,特別是在我們捕捉程序崩潰,跟蹤調查基 于棧的緩沖區溢出的時候。
- 序
- 1 搭建開發環境
- 1.1 操作系統準備
- 1.2 獲取和安裝 Python2.5
- 1.3 配置 Eclipse 和 PyDev
- 2 調試器設計
- 2.1 通用 CPU 寄存器
- 2.2 棧
- 2.3 調試事件
- 2.4 斷點
- 3 自己動手寫一個 windows 調試器
- 3.2 獲得 CPU 寄存器狀態
- 3.3 實現調試事件處理
- 3.4 全能的斷點
- 4 PyDBG---純 PYTHON 調試器
- 4.1 擴展斷點處理
- 4.2 處理訪問違例
- 4.3 進程快照
- 5 IMMUNITY----最好的調試器
- 5.1 安裝 Immunity 調試器
- 5.2 Immunity Debugger 101
- 5.3 Exploit 開發
- 5.4 搞定反調試機制
- 6 HOOKING
- 6.1 用 PyDbg 實現 Soft Hooking
- 6.2 Hard Hooking
- 7 Dll 和代碼注入
- 7.1 創建遠線程
- 7.2 邪惡的代碼
- 8 FUZZING
- 8.1 Bug 的分類
- 8.2 File Fuzzer
- 8.3 改進你的 Fuzzer
- 9 SULLEY
- 9.1 安裝 Sulley
- 9.2 Sulley primitives
- 9.3 獵殺 WarFTPD
- 10 Fuzzing Windows 驅動
- 10.1 驅動通信
- 10.2 用 Immunity fuzzing 驅動
- 10.4 構建 Driver Fuzzer
- 11 IDAPYTHON --- IDA 腳本
- 11.1 安裝 IDAPython
- 11.2 IDAPython 函數
- 11.3 腳本例子
- 12 PyEmu
- 12.1 安裝 PyEmu
- 12.2 PyEmu 一覽
- 12.3 IDAPyEmu