存放gdb筆記
自動化 GDB 腳本
python 控 gdb 自動化腳本可以透過以下方法使用
這個確保 -x
這個參數開啟腳本就可以 import gdb
了
gdb -x debug-script.py
python script 中可以輸入
import gdb
相關的 API 可以查詢 Python (Debugging with GDB)
也可以在 pwntool 中 pwntool.gdb.attach(foo, api=True)
來啟用 gdb api
pid, gdb2 = gdb.attach(c, api=True)
gdb2.execute('c')
如果需要進行運算或顯示暫存器可以透過
gdb.parse_and_eval('$rax + 0x10')
這個部分在 reversing 或 pwn 的時候,可以根據條件進行操作等等
在 gdb 當中使用 pi
指令可以進入 Python interpreter
pi print('a')
另外如果要開發的話可以使用 gef.py
裡面的 API
GDB Script
透過GDB script來保存重複的行為提昇除錯效率。
這裡假設建立檔案example.gdbscript
,內容如下
l
b main
r
s
之後在gdb
當中執行script
source example.gdbscript
註:gdb在每次除錯的時候會留下.gdb_history
,
可以用來當成script的素材
其他請參見簡易 GDB Script 教學,應用
工具
gef 和 pwndbg 都可與 tmux 整合。
指令
finish
: 完成當前的函數之後停止b
: 設立中斷點c
: 持續執行到中斷點
中斷點使用範例,在特定地址中斷
b *0x12345678
watch point
檢測特定 syscall 呼叫時發生斷點
catch syscall write
檢視特定 struct
p *(struct link_map*) 0x00123113
如果有除錯符號可以使用 ptype <symbol>
檢視
ptype fp
ptype FILE
檢視 section 相關資訊
maintenance info sections
找出地址所屬的 mapping
採用 gef 提供的 vmmap
vmmap 0x0x404040
傳入參數執行
run arg1 arg2 arg3...
run $(printf "123")123
run $(shell)
gdb界面
- Emacs GDB
- cgdb
參考
跨架構除錯
我們可以透過 qemu-linux-user 執行 gdb server 之後安裝 gdb-multiarch
apt install gdb-multiarch
如果是 archlinux
gpg --recv-keys 92EDB04BFF325CF3
pacaur -S gdb-multiarch
Kernel-Mode Debugging
在研究 kernel 或 kernel exploit 時需要透過 Qemu 執行 kernel 並且 attach gdb
qemu-system-x86_64 --kernel /boot/vmlinuz-linux -nographic -s -S
確保 gdb 擁有 root 權限,否則會出現 [!] Command 'gef-remote' failed to execute properly, reason: [Errno 13] Permission denied: '/proc/1/maps'
sudo gdb
啟動 gdb 並且設置目標主機架構
set architecture i386:x86-64
# 如果上面指令沒有效果用這個指令
pi reset_architecture("X86_64")
透過 gef attach 上 qemu,確保有加上 --qemu-mode
gef-remote --qemu-mode localhost:1234
另外參見 gdb 的 qemu monitor 指令 QEMU Monitor — QEMU documentation可以用下列方法使用
monitor system_reset
問題排解
QEMU
qemu 除錯時,報錯 Command 'context' failed to execute properly, reason: 'NoneType' object has no attribute 'all_registers'
確保 set arch
之後使用 gef-remote --qemu-mode
而不是 target remote
set arch i386:x86-64
gef-remote --qemu-mode addr:port
pwndbg 似乎直接 target remote 就可以,並且可以看到 stack,但 gdb 不行
target remote:3333
不過 pwndbg 和 gef 如果運作不正常可以嘗試用 root 執行
參見
- kernelexp学习笔记 | d1nn3r’s Blog 當中包含各種 qemu 除錯的疑難排解
- Kernel pwn CTF 入门 | Kiprey’s Blog
--qemu-mode
從這裡看到的,如果上面的筆記無法排解,可以參見這篇 - Symbols (Debugging with GDB)
C C++ Debug Debugger gdb Linux