剛開始打pwn的人應該都會遇到一個問題就是不會看暫存器,所以今天就是要做一個暫存器的介紹及說明
暫存器是處理器內部的一種高速記憶體,用來儲存和處理運算過程中的數據。它的速度比 RAM 快很多,因為它直接內建在處理器內,通常用來暫時儲存正在執行的指令、資料或運算結果。
不過今天主要聚焦在gdb的通用暫存器,所以就先不詳細說明那麼多
| 64 bit | 32 bit | 16 bit | 8 bit |
|---|---|---|---|
| RAX | EAX | AX | AH,AL |
| RBX | EBX | BX | BH,BL |
| RCX | ECX | CX | CH,CL |
| RDX | EDX | DX | DH,DL |
| RDI | EDI | DI | DIL |
| RSI | ESI | SI | SIL |
| RBP | EBP | BP | BPL |
| RSP | ESP | SP | SPL |
| R8 | R8D | R8W | R8B |
| R9 | R9D | R9W | R9B |
| R10 | R10D | R10W | R10B |
| R11 | R11D | R11W | R11B |
| R12 | R12D | R12W | R12B |
| R13 | R13D | R13W | R13B |
| R14 | R14D | R14W | R14B |
| R15 | R15D | R15W | R15B |
這麼多暫存器對某些人來說可能很難記起來,不過這裡有一個小小的方法
我們可以發現在AX~SP的開頭都有著一些規律
這裡上圖例
(圖1)
接著我們可以發現R8~R15也有類似的規律
接下來以64bit來做一下RAX~R15都是在幹嘛的
| 暫存器 | 名稱 | 常見用途 |
|---|---|---|
| RAX | Accumulator Register | 做運算或函數回傳值會放這,例如加法、系統呼叫回傳值。 |
| RBX | Base Register | 常拿來存資料的基底地址(像陣列開頭)。 |
| RCX | Counter Register | 用來當計數器,像迴圈、rep 等字串操作會用到。 |
| RDX | Data Register | 存中間運算資料,也常用來當第 3 個參數(像 read)。 |
| RDI | Destination Index | 函數的第 1 個參數會放這裡,或字串的目標位址。 |
| RSI | Source Index | 函數的第 2 個參數會放這,或字串來源位置。 |
| RBP | Base Pointer | 指向堆疊框架底部,方便找區域變數(可看成「起點」)。 |
| RSP | Stack Pointer | 永遠指向堆疊頂端,函數進出都靠它。 |
| R8 | — | 函數的第 5 個參數。 |
| R9 | — | 函數的第 6 個參數。 |
| R10 | Temporary Register | 暫時用的寄存器,系統呼叫時當第 4 個參數或中繼用。 |
| R11 | Temporary Register | 也是暫時用的,不會自動保留內容(caller-saved)。 |
| R12 | Callee-saved Register | 函數之間會保留內容,可安心暫存變數。 |
| R13 | Callee-saved Register | 同上。 |
| R14 | Callee-saved Register | 同上。 |
| R15 | Callee-saved Register | 同上。 |
OK,register講完了當然要講一下Flags是怎麼設定的,那我們接下來就介紹Flags吧
Flags是CPU目前狀態的狀態暫存器。他反映算術運算的結果及當前CPU操作的限制資訊。這些限制可能包括阻止某些中斷觸發,禁止執行一類特權指令。其他狀態Flag可以繞過記憶體映射,並定義CPU在算術溢位時應採取的動作
| Bit 位元 | Flag | 說明 |
|---|---|---|
| 0 | CF (Carry) | 無號數加減運算產生進位 / 借位 |
| 2 | PF (Parity) | 最低位元組為偶數個 1 時為 1 |
| 4 | AF (Auxiliary) | BCD 運算中低半位進位(較少用) |
| 6 | ZF (Zero) | 結果為 0 時為 1 |
| 7 | SF (Sign) | 結果為負時為 1(最高 bit 為 1) |
| 8 | TF (Trap) | 單步模式,用於除錯 |
| 9 | IF (Interrupt) | 是否允許中斷(1 = 可中斷) |
| 10 | DF (Direction) | 控制字串操作方向(0 = 遞增,1 = 遞減) |
| 11 | OF (Overflow) | 有號數溢位時為 1 |
| 12–13 | IOPL (I/O Privilege) | I/O 權限等級(Ring 0–3) |
| 14 | NT (Nested Task) | 巢狀任務處理相關 |
| 16 | RF (Resume) | 回復除錯例外用(單步不觸發中斷) |
| 17 | VM (Virtual 8086) | 進入虛擬 8086 模式 |
| 18 | AC (Alignment Check) | 對齊檢查 |
| 19 | VIF (Virtual IF) | 虛擬中斷旗標 |
| 20 | VIP (Virtual IP) | 虛擬中斷處理中 |
| 21 | ID (ID Flag) | CPUID 指令是否可用 |
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture