GDB

存放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 整合。

指令

中斷點使用範例,在特定地址中斷

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界面

參考

跨架構除錯

我們可以透過 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 執行

參見


C C++ Debug Debugger gdb Linux