菜鳥筆記之pwn工具篇--Pwndbg基礎使用

XiDP發表於2024-10-03

什麼是pwndbg?

它是gdb的一個外掛,增加了許多功能,來幫助pwn手可以快速尋找到所需要的資訊,除了pwndbg之外還有pedagef等工具可以用來協助進行除錯。

如何給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 位元組)
示例:
  1. 檢視記憶體地址的內容
x/10x 0x7fffffffe000

以上命令將以十六進位制格式顯示從 0x7fffffffe000 開始的10個位元組的內容。

  1. 檢視變數的內容
x/4d my_array

該命令將以十進位制格式檢視 my_array 陣列的前4個元素。

2. p 命令

p 命令用於列印變數的值,通常用於檢視變數的當前狀態。其基本語法如下:

p [expression]
引數說明:
  • expression:要列印的變數名或表示式。
示例:
  1. 列印簡單變數
p my_variable

該命令將輸出 my_variable 的當前值。

  1. 列印結構體成員
p my_struct.member

此命令將輸出結構體 my_structmember 的值。

  1. 列印表示式的值
p my_variable + 10

該命令將輸出 my_variable 的值加上10的結果

#### 3. 常見用法示例

3.1 列印變數地址

使用 & 運算子可以列印變數的地址:

p &my_variable

3.2 觀察陣列

結合 px 命令,可以更好地觀察陣列內容:

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

相關文章