gdb 常用命令總結
安裝插件
1. 安裝GDB增強工具 (gef)
* wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
2. GDB安裝插件(在root權限安裝,用戶權限使用不了需要在用戶權限下安裝)
git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins (安裝gdb的Python腳本插件)
echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit (默認打開gdb插件是pada) 傾向于破解和逆向
echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit 傾向于debug 逆向
echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit 個人定制
pwndbg安裝
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
cat .gdbinit
3.Linux程序發布流程
* 確定程序是否存在符號表
readelf -s test-1
* 生成符號表
objcopy --only-keep-debug test-1 test-1.symbol
* 生成發布程序
objcopy --strip-debug test-1 test-release
* 使用符號表進行程序debug
gdb -q --symbol=test-1.symbol --exec=test-release
gdb 語法的使用
gcc -g -o main main.c
gdb -q (-q用以使得gdb不輸出gdb程序的版本等信息)-tui 選項開啟gdb命令輸入和源代碼的分屏顯示 main
分別在父進程和子進程的位置設置好斷點(b 18), 然后r運行程序即可斷下來:
所有命令,只要不出現沖突,都可以進行簡寫,如list可直接簡寫為l,break可直接簡寫為b。
list 行號/函數名 查看指定位置的源碼
info break|watch|... 顯示斷點信息,watch 信息
break 行號/函數名 設置斷點
tbreak/tb 臨時斷點(斷點只生效一次)
del/clear 刪除斷點
ingore (ignore N COUNT)忽略斷點N,次數為COUNT,即前COUNT次斷點不觸發
start 運行(自動在main函數處停下)
run 運行程序
next 單步運行,不進入函數內部
step 單步運行,進入函數內部
ni 下一條指令
si 進入函數(匯編級)
continue 繼續運行,直到結束或者斷點
n 10 運行10行代碼
ni 10 運行10條指令
until 退出循環
finish 退出函數(相當于是快進)
return 退出函數(它是強制退出,跳過了中間的指令)
call 調用函數
watch 變量|表達式 觀察變量或表達式,若其改變則停止
print 變量|表達式 查看程序運行時對應的變量或表達式的值
set 變量=新值 設置變量在內存中的當前值
backtrace/bt 若程序宕掉,查看函數調用棧
display 自動打印變量(每次程序暫停,都自動打印)
x 參數為內存地址,打印內存(help x查看用法)
info reg all 打印所有寄存器
條件斷點:比如 b foo if a==1 ,條件成立是觸發斷點
執行shell命令(在命令前輸入shell即可,比如shell clear就相當于是執行了shell中的clear命令,清屏)
stack 50 查看連續50個調用棧
vmmap 查看程序的段
heap
bins
distance addr1 addr2 計算兩個內存的距離
x/<n/f/u> <addr> 來查看內存地址中的值
n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向后顯示幾個地址的內容
f 表示顯示的格式,如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
x 按十六進制格式顯示變量。
d 按十進制格式顯示變量。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變量。
t 按二進制格式顯示變量。
u 參數可以用下面的字符來代替,b表示單字節,h表示雙字節,w表示四字節,g表示八字節。
當我們指定了字節長度后,GDB會從指內存定的內存地址開始,讀寫指定字節,并把其當作一個值取出來。
x/40gz 從指定地址向后查看40個內存值,8字節對齊16進制顯示
多進程調試
設置follow-fork-mode (parent/child)和detach-on-fork (on/off)的值來調試子程序
follow-fork-mode detach-on-fork
parent on 只調試主進程(GDB默認)
child on 只調試子進程
parent off 同時調試兩個進程, gdb跟主進程, 子進程block在fork位置
child off 同時調試兩個進程,gdb跟子進程,主進程block在fork位置
set follow-fork-mode child
set detach-on-fork off
show follow-fork-mode/detach-on-fork
進程間切換
gdb會為inferiors分配ID, 其中帶有*的進程是正在調試的inferior;gdb將每一個被調試程序的執行狀態記錄在一個名為inferior的結構中;
info inferiors 查看當前此時顯示gdb調試的所有inferior
inferior ID切換到對應id的斷點進程
多線程調試
gcc -g -o thread -lpthread thread.c
info threads 來查看有多少個線程
thread threadID 切換調試的線程
show non-stop 查看線程調試時運行的模式
show scheduler-locking
set scheduler-locking on|off|step
on 鎖定其他線程,只有當前線程執行
off 不鎖定任何線程
step 只有被調試線程運行
thread apply threadID gdbCmd 指定某線程執行某gdb命令
thread apply all gdbCmd 全部的線程執行某gdb命令
程序靜態/動態分析工具
IDA Pro/ winhex pedit binwalk(識別壓縮殼,解壓等)
readelf c++filter
OllyDebug
gdb
gdb插件調試的常用命令
peda
aslr on|off
aslr
dumprop
elfheader
elfsysmbol
dumpargs
checksec
canary 棧保護 加入cookie
NX 棧不可執行
PIE(alsr) 每次執行內存地址隨機化
Fortify 棧參數保護檢測
relro GOT只讀
參考:
匯編:https://blog.csdn.net/weixin_51325053/article/details/117511668
https://www.136.la/mysql/show-44335.html
https://blog.csdn.net/qq_29809823/article/details/118941735
多線程: https://blog.csdn.net/weixin_42158742/article/details/113100151
多進程: https://blog.csdn.net/qq_40827990/article/details/110423679
x命令:https://blog.csdn.net/u013985241/article/details/89169007
浙公網安備 33010602011771號