[CSAPP]Bomb Lab 解題筆記
🐳 GDB 常用指令
🦀 控制執行
break phase_1 # 在函數設中斷點
break *0x400ee0 # 在特定位址設中斷點
run # 開始執行
run < solution.txt # 用檔案輸入執行
continue (c) # 繼續執行到下個中斷點
ni # 執行一條指令(不進入函數)
si # 執行一條指令(會進入函數)
🦀 查看程式碼
disassemble # 看當前函數的組語
disassemble phase_2 # 看指定函數的組語
layout asm # 開啟組語視窗(視覺化)
layout regs # 顯示暫存器視窗
ctrl + x, 再按 a # 退出 layout
x/i $rip # 看當前要執行的指令
🦀 查看資料
print $rax # 看暫存器的值(十進位)
print/x $rax # 看暫存器的值(十六進位)
info registers # 看所有暫存器
info registers rdi rsi # 只顯示特定暫存器
x/d $rsp # 看記憶體內容(十進位,預設 8 bytes)
x/dw $rsp # 看記憶體內容(十進位,4 bytes = int)
x/6d $rsp # 看 6 個數字
x/x $rsp # 看記憶體內容(十六進位)
x/s 0x402400 # 看記憶體內容(字串)
x/i $rip # 看記憶體內容(指令)
x/8a 0x402470 # 看 8 個位址(用於 jump table)
backtrace # 顯示函數呼叫堆疊(call stack),看目前在哪個函數、是被誰呼叫的
bt # 顯示函數呼叫堆疊(call stack),看目前在哪個函數、是被誰呼叫的
where # 顯示函數呼叫堆疊(call stack),看目前在哪個函數、是被誰呼叫的
🦀 其他
quit (q) # 離開 gdb
🐳 x86-64 Assembly 基礎知識
🦀 常用暫存器與用途
函數參數傳遞(calling convention):
%rdi → 第 1 個參數
%rsi → 第 2 個參數
%rdx → 第 3 個參數
%rcx → 第 4 個參數
%r8 → 第 5 個參數
%r9 → 第 6 個參數
其他重要暫存器:
%rax → 函數返回值
%rsp → stack pointer(指向 stack 頂端)
%rbp → base pointer(stack frame 的基準)
%rip → instruction pointer(下一條要執行的指令)
🦀 指令語法(AT&T 格式)
mov %rsp,%rsi # 把 %rsp 的值複製到 %rsi
# 格式:mov 來源, 目的地
add %eax,%eax # %eax = %eax + %eax(乘以 2)
🦀 記憶體存取語法
(%rsp) # 取 %rsp 指向的記憶體內容
0x4(%rsp) # 取 %rsp + 4 的記憶體內容
-0x4(%rbx) # 取 %rbx - 4 的記憶體內容
0x402470(,%rax,8) # 計算:0x402470 + %rax * 8
🦀 比較和跳躍指令
cmp %eax,(%rbx) # 比較 (%rbx) 和 %eax
je 地址 # jump if equal(相等就跳)
jne 地址 # jump if not equal(不相等就跳)
jg 地址 # jump if greater(大於就跳)
ja 地址 # jump if above(無號數大於)
jbe 地址 # jump if below or equal(小於等於就跳)