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那樣顯示數據,帶字符串 
