pwndbg基本操作
基本指令
help
//幫助i
//info,查看一些信息,只輸入info可以看可以接什么參數,下面幾個比較常用i b
//常用,info break 查看所有斷點信息(編號、斷點位置)i r
//常用,info registers 查看各個寄存器當前的值i f
//info function 查看所有函數名,需保留符號
show
//和info類似,但是查看調試器的基本信息,如:show args
//查看參數
rdi
//常用,+寄存器名代表一個寄存器內的值,用在地址上直接相當與一個十六進制變量backtrace
//查看調用棧q
//quit 退出,常用vmmap
//內存分配情況
執行指令
s
//單步步入,遇到調用跟進函數中,相當於step into,源碼層面的一步si
//常用,同s,匯編層面的一步
n
//單步補過,遇到函數不跟進,相當於step over,源碼層面的一步ni
//常用,同n,匯編層面的一步
c
//continue,常用,繼續執行到斷點,沒斷點就一直執行下去r
//run,常用,重新開始執行start
// 類似於run
,停在main函數的開始
斷點指令
下普通斷點指令b(break):
b *(0x123456)
//常用,給0x123456地址處的指令下斷點b *$ rebase(0x123456)
//$rebase 在調試開PIE的程序的時候可以直接加上程序的隨機地址
b fun_name
//常用,給函數fun_name下斷點,目標文件要保留符號才行b file_name:fun_name
b file_name:15
//給file_name的15行下斷點,要有源碼才行b 15
b +0x10
//在程序當前停住的位置下0x10的位置下斷點,同樣可以-0x10,就是前0x10break fun if $rdi==5
//條件斷點,rdi值為5的時候才斷
刪除、禁用斷點:
info break
(簡寫:i b
) //查看斷點編號delete 5
//常用,刪除5號斷點,直接delete不接數字刪除所有disable 5
//常用,禁用5號斷點enable 5
//啟用5號斷點clear
//清除下面的所有斷點
內存斷點指令watch:
watch 0x123456
//0x123456地址的數據改變的時候會斷watch a
//變量a改變的時候會斷info watchpoints
//查看watch斷點信息
捕獲斷點catch:
catch syscall
//syscall系統調用的時候斷住tcatch syscall
//syscall系統調用的時候斷住,只斷一次info break
//catch的斷點可以通過i b查看
除syscall外還可以使用的有:
1)throw: 拋出異常
2)catch: 捕獲異常
3)exec: exec被調用
4)fork: fork被調用
5)vfork: vfork被調用
6)load: 加載動態庫
7)load libname: 加載名為libname的動態庫
8)unload: 卸載動態庫
9)unload libname: 卸載名為libname的動態庫
10)syscall [args]: 調用系統調用,args可以指定系統調用號,或者系統名稱
打印指令
查看內存指令x:
x /nuf 0x123456
//常用,x指令的格式是:x空格/nfu,nfu代表三個參數n
代表顯示幾個單元(而不是顯示幾個字節,后面的u表示一個單元多少個字節),放在/
后面u
代表一個單元幾個字節,b(一個字節),h(2字節),w(四字節),g(八字節)f
代表顯示數據的格式,f和u的順序可以互換,也可以只有一個或者不帶n,用的時候很靈活
x 按十六進制格式顯示變量。
d 按十進制格式顯示變量。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變量。
t 按二進制格式顯示變量。
a 按十六進制格式顯示變量。
c 按字符格式顯示變量。
f 按浮點數格式顯示變量。
s 按字符串顯示。
b 按字符顯示。
i 顯示匯編指令。
x /10gx 0x123456
//常用,從0x123456開始每個單元八個字節,十六進制顯示10個單元的數據x /10xd $rdi
//從rdi指向的地址向后打印10個單元,每個單元4字節的十進制數x /10i 0x123456
//常用,從0x123456處向后顯示十條匯編指令
打印指令p(print):
-
p fun_name
//打印fun_name的地址,需要保留符號 -
p 0x10-0x08
//計算0x10-0x08的結果 -
p &a
//查看變量a的地址 -
p *(0x123456)
//查看0x123456地址的值,注意和x指令的區別,x指令查看地址的值不用星號 -
p $rdi
//顯示rdi寄存器的值,注意和x的區別,這只是顯示rdi的值,而不是rdi指向的值p *($rdi)
//顯示rdi指向的值
打印匯編指令disass(disassemble):
disass 0x123456
//顯示0x123456前后的匯編指令x /10i
//我一般喜歡用x顯示指令
打印源代碼指令list:
list
//查看當前附近10行代碼,要有源碼,list指令pwn題中幾乎不用,但為了完整性還是簡單舉幾個例子list 38
//查看38行附近10行代碼list 1,10
//查看1-10行list main
//查看main函數開始10行
修改和查找指令
修改數據指令set:
set $rdi=0x10
//把rdi寄存器的值變為0x10set *(0x123456)=0x10
//0x123456地址的值變為0x10,注意帶星號set args "abc" "def" "gh"
//給參數123賦值set args "python -c 'print "1234\x7f\xde"'"'
//使用python給參數賦值不可見字符
查找數據:
search rdi
//從當前位置向后查包含rdi的指令,返回若干search -h
//查看search幫助,我也不太長用這個指令find "hello"
//查找hello字符串,pwndbg獨有ropgadget
//查找ropgadget,pwndbg獨有,沒啥用,可以用其他工具
堆操作指令(pwndbg插件獨有)
-
arena
//顯示arena的詳細信息arenas
//顯示所有arena的基本信息arenainfo
//好看的顯示所有arena的信息
-
bins
//常用,查看所有種類的堆塊的鏈表情況
fastbins
//單獨查看fastbins的鏈表情況largebins
//同上,單獨查看largebins的鏈表情況smallbins
//同上,單獨查看smallbins的鏈表情況unsortedbin
//同上,單獨查看unsortedbin鏈表情況tcachebins
//同上,單獨查看tcachebins的鏈表情況tcache
//查看tcache詳細信息
-
heap
//數據結構的形式顯示所有堆塊,會顯示一大堆
heapbase
//查看堆起始地址heapinfo
、heapinfoall
//顯示堆得信息,和bins的挺像的,沒bins好用parseheap
//顯示堆結構,很好用
-
tracemalloc
//好用,會跟提示所有操作堆的地方
其他pwndbg插件獨有指令
-
cyclic 50
//生成50個用來溢出的字符,如:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama -
$reabse
//開啟PIE的情況的地址偏移b *$reabse(0x123456)
//斷住PIE狀態下的二進制文件中0x123456的地方codebase
//打印PIE偏移,與rebase不同,這是打印,rebase是使用
-
stack
//查看棧 -
retaddr
//打印包含返回地址的棧地址 -
canary
//直接看canary的值 -
plt
//查看plt表 -
got
//查看got表 -
hexdump
//像IDA那樣顯示數據,帶字符串