iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
Security

現在是pwn的天下!系列 第 2

【Day-2】暫存器 (register) 介紹

  • 分享至 

  • xImage
  •  

前言

剛開始打pwn的人應該都會遇到一個問題就是不會看暫存器,所以今天就是要做一個暫存器的介紹及說明

說明

暫存器是處理器內部的一種高速記憶體,用來儲存和處理運算過程中的數據。它的速度比 RAM 快很多,因為它直接內建在處理器內,通常用來暫時儲存正在執行的指令、資料或運算結果。

種類

  1. 通用暫存器(General-Purpose Registers, GPR)
  2. 指令寄存器(Instruction Register, IR)
  3. 程式計數器(Program Counter, PC)
  4. 堆疊指標(Stack Pointer, SP)
  5. 基址寄存器(Base Register, BP)
  6. 變址寄存器(Index Register, IP)
  7. 標誌寄存器(Flag Register)
  8. 指令長度寄存器(Instruction Length Register, ILR)
  9. 特殊功能寄存器(Special Purpose Registers, SPR)
  10. 浮點寄存器(Floating Point Register)
  11. 段寄存器(Segment Register)
  12. 控制寄存器(Control Registers)

不過今天主要聚焦在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的開頭都有著一些規律

  • 64bit: R開頭(意思為Register)
  • 32bit: E開頭(意思為Extended,低 32 位)
  • 16bit: 無開頭(低 16 位)
  • 8bit: 在AX~DX會分為兩個部分(低 8 位)
    • H (High byte): 指向AX寄存器的高8位
    • L (Low byte): 指向AX寄存器的低8位
      DI~SP以L結尾

這裡上圖例
https://ithelp.ithome.com.tw/upload/images/20250806/20172088JelDlcjhlv.png
(圖1)

接著我們可以發現R8~R15也有類似的規律

  • 64bit: 自己本身 (完整的64位寄存器)
  • 32bit: 以D結尾 (低32位)
  • 16bit: 以W結尾 (低16位)
  • 8bit: 以B結尾 (最低8位)

接下來以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

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


上一篇
【Day-1】介紹ELF與ASM
下一篇
【Day-3】詳細說明stack frame運作原理,學buffer overflow前必須知道的事
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言