什麼是pwndbg?
它是gdb
的一個外掛,增加了許多功能,來幫助pwn手可以快速尋找到所需要的資訊,除了pwndbg
之外還有peda
、gef
等工具可以用來協助進行除錯。
如何給pwndbg分屏?
vim ~/.gdbinit
set context-output /dev/pts/2 # 這裡修改成2,那麼就會在第二個終端顯示資訊
pwndbg的基礎操作:
啟動除錯:
gdb ./檔名
比如:gdb ./pwn
如果我們已經成功安裝了pwndbg
,那麼開啟gdb
之後會顯示pwndbg>
這樣的提示符號,否則是gdb>
基礎操作:
**************************************************
pwndbg> start
# 開始執行,會停留在start函式上(start函式是main函式之前的一個函式)
**************************************************
pwndbg> q
# 退出除錯
**************************************************
pwndbg> r
# 從頭執行程式直到遇到斷點,沒有斷點則會一直執行到結束
**************************************************
pwndbg> c
# 繼續執行程式直到遇到斷點,沒有斷點則會一直執行到結束
**************************************************
pwndbg> n
# 單步步過,n不會進入一個小函式
**************************************************
pwndbg> ni
# 常用,同n,但是是彙編層面的一步
**************************************************
pwndbg> s
# 步入,比如遇到一個call 什麼什麼函式,s會進入看看怎麼個事
**************************************************
pwndbg> si
# 常用,同s,但是是彙編層面的一步
**************************************************
pwndbg> fini
# 快速執行結束當前函式
**************************************************
pwndbg> context
# 重新列印頁面資訊
**************************************************
pwndbg> b function_name
# 比如: b read 在read函式上下斷點,執行到read函式的時候就會停止
**************************************************
pwndbg> b *(&function_name+offset)
# 比如: b *(&read + 10) 在read函式+10的地址上下斷點,執行到這個地址的時候就會停止
**************************************************
pwndbg> b *0xaddr
# 比如: b *0x408010 那麼程式執行到0x408010這個地址的時候就會停止
**************************************************
pwndbg> i b
# 檢視斷點資訊,哪些地方打了斷點
**************************************************
pwndbg> delete <斷點序號>
# 刪除斷點序號對應的斷點,單獨一個delete會刪除所有斷點
**************************************************
pwndbg> i r
# 檢視所有暫存器中儲存的資料
**************************************************
pwndbg> i r <registers>
# 檢視具體某一個暫存器的值 比如: pwndbg> i r rax
**************************************************
pwndbg> stack <int>
# 檢視棧中的資訊,具體數量填在stack後面,比如: stack 50
**************************************************
pwndbg> search <string>
# 在程式中檢視字串,可以檢視自己輸入的資訊被存在什麼地方了
**************************************************
pwndbg> set $<rigister> = <int>
# 使用set來給暫存器設定自定義的值
**************************************************
pwndbg> bt
# 檢視我們當前這個函式的上一個函式是什麼
**************************************************
pwndbg> vmmap
# 檢視程式各個段的位置以及許可權等資訊
**************************************************
pwndbg> elf
# 檢視elf檔案資訊
**************************************************
pwndbg> bins
# 檢視釋放的堆塊
**************************************************
pwndbg> heap
# 檢視正在使用的堆塊
**************************************************
x命令和p命令的使用:
1. x
命令
x
命令用於檢視記憶體中的資料。它可以顯示指定地址或變數所佔記憶體的內容。其基本語法如下:
x/[n][f][u] addr
引數說明:
n
:可選,表示要顯示的單元數量,預設為1。f
:可選,表示顯示的格式,常見格式包括:d
:十進位制整數x
:十六進位制o
:八進位制c
:字元f
:浮點數
u
:可選,表示資料單位,常見單位包括:b
:位元組h
:半字(2 位元組)w
:字(4 位元組)g
:巨字(8 位元組)
示例:
- 檢視記憶體地址的內容:
x/10x 0x7fffffffe000
以上命令將以十六進位制格式顯示從 0x7fffffffe000
開始的10個位元組的內容。
- 檢視變數的內容:
x/4d my_array
該命令將以十進位制格式檢視 my_array
陣列的前4個元素。
2. p
命令
p
命令用於列印變數的值,通常用於檢視變數的當前狀態。其基本語法如下:
p [expression]
引數說明:
expression
:要列印的變數名或表示式。
示例:
- 列印簡單變數:
p my_variable
該命令將輸出 my_variable
的當前值。
- 列印結構體成員:
p my_struct.member
此命令將輸出結構體 my_struct
中 member
的值。
- 列印表示式的值:
p my_variable + 10
該命令將輸出 my_variable
的值加上10的結果
#### 3. 常見用法示例
3.1 列印變數地址
使用 &
運算子可以列印變數的地址:
p &my_variable
3.2 觀察陣列
結合 p
和 x
命令,可以更好地觀察陣列內容:
x/10d my_array p my_array[0]
3.3 列印指標指向的值
如果列印指標指向的內容,可以使用 *
:
p *my_pointer
在 gdb
中是可以設定地址隨機化開關,需要的時候可以關閉,來幫助我們除錯
pwndbg> set disable-randomization on # 開
pwndbg> set disable-randomization off # 關
pwndbg> show disable-randomization # 查
參考文獻:
gdb除錯入門指北 - ve1kcon - 部落格園 (cnblogs.com)
pwn技術分享——pwndbg分屏顯示設定_嗶哩嗶哩_bilibili