GDB: GUN Debugger
Learn How To Debug Binary
Demo source code
gdb ./filename
我有裝 plug-in,所以21行一般顯示 gdb,而我是顯示 gef
執行檔案
breakpoint,顧名思義就是在程式執行時下斷點,讓程式停在在某個指令(instruction),好讓我們可以更方便的分析程式行為
如果使用
gcc -g
編譯(生成),則可以使用b [number]
在第number
行進行斷點。
如果該執行檔被 strip(),則可以先去靜態分析找到
main
的地址 然後使用b *[address]
對該地址下斷點
i b
→ info breakpoint
列出目前的 breakpoint
d [breaknumber]
→ delete breakpoint
刪除 breakpoint,注意這邊是使用 breakpoint number
ni means next instruction
si means step in instrction
Differen with ni
and si
ni 是執行下一個指令,不步入
function
,而 si 也是執行下一個指令,但他會步入function
以下(表/圖?)為例,我們的
$rip
,指在0x555555555228
,的位置
使用
ni
後$rip
會指在0x55555555522d
如果使用
si
後$rip
會指在0x555555555189
,也就是會指到welcome
這個 function 的一開始,進入這個 function,慢慢執行這個 function 的每一個指令,這就是步入
繼續執行,跟 run 很像,差別在於 run 是從頭開始執行, continue 是從目前的
$rip
繼續執行
Finish current function call
舉例來說我在
main
call 了increase_int
,然後我在increase_int
裡面執行到一半,這時候我使用finish
,則 GDB 會把increase_int
執行完(就是執行完increate_int
的ret
),這時候$rip
會指在main
function callincrease_int
的下一行指令
x 指令是可以查看記憶體 value 的 command
x [Address expression]
x /[Format] [Address expression]
x /[Length][Format] [Address expression]
查看某個地址的數值
查看某個地址接下來的10個單位位置的數值(單位預設為 4bytes)
查看某個地址接下來的10個單位位置的數值(g 指令了單位為 8bytes)
查看某個地址接下來的10個單位位置的數值(g 指令了單位為 8bytes),並且使用 16 進制
x/10i [address] 可以看10個 instruction
把 0x0000555555555000 ~ 0x0000555555557000 的 memory contant 拉下來放進 dump.dmp,然後使用 ida 開 (目前不確定副檔名有沒有差)
查看 call stack,Trace Function Call
在 ctf 時如果想要 attach 上自己的 exploit,去觀察
$register
,stack
之類的資訊,可以使用 gdb -p <exploit_pid>
就是 interrupt,可以在執行時使用,他會 interrupt 住整個 process,方便觀察目前 process 的狀態,再使用前面提到的 contiune 就可以讓 process 繼續執行
當程序接收到 SIGINT 信號時,GDB 會:
GDB Tutorial
這部教學影片是基於 gcc -g
去編譯的可執行檔,所以有更多功能可以使用,我這邊沒有使用,所以缺少符號表、行號之類的東西,所以有些 feature 不能使用