コンテンツにスキップ

pwndbg - GDB/LLDB エクスプロイト開発チートシート

pwndbg - GDB/LLDB エクスプロイト開発チートシート

pwndbg(「pwn-dee-bee-gee」と発音)はGDBに、そして現在はLLDBにも読み込まれるPythonプラグインで、エクスプロイト開発とリバースエンジニアリングをはるかに苦しくなくします。ヒープ検査、ROPガジェット検索、レジスタ/スタック/ポインタ「テレスコーピング」、すべての停止時にスマートなコンテキスト表示、およびコアデバッガが提供しなかった数十のコマンドを追加します。これはPEDAの後継であり、GEFの兄弟です。

インストール

方法コマンド
セットアップスクリプト(推奨)git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh
Nixnix profile install github:pwndbg/pwndbg
Arch (AUR)yay -S pwndbg
手動GDB読み込み~/.gdbinitsource /path/to/pwndbg/gdbinit.pyを追加
LLDB~/.lldbinitcommand script import /path/to/pwndbg/lldbinit.pyを追加
確認gdbを起動 — pwndbg>プロンプトが表示されるはず

セッションの開始

コマンド説明
gdb ./binarypwndbgの下でバイナリを読み込む
gdb -p PID実行中のプロセスにアタッチ
gdb ./binary coreコアダンプを開いてポストモーテム分析を実行
start実行してmainで中断
entry実行してELFエントリーポイントで中断
r ARGS引数を指定して実行
starti最初の命令で停止

コンテキストとナビゲーション

コマンド説明
context完全なコンテキストを再描画(レジスタ、逆アセンブル、スタック、バックトレース)
context regレジスタペインのみを表示
ctx-watch EXPRコンテキストウォッチペインに式を追加
nextcall次のcall命令までステップ
nextret次のretまでステップ
stepuntilasm mov指定されたニーモニックまでステップ
xinfo ADDRアドレスが何にマップされているかを説明(どのマッピング/セクション)

メモリ検査

コマンド説明
telescope ADDRポインタのチェーンをデリファレンス及び「テレスコーピング」
telescope $sp 20スタックポインタから20エントリをテレスコーピング
hexdump ADDR16進数+ASCII ダンプ(GDBが提供すべきコマンド)
vmmapプロセスの仮想メモリマップを表示
vmmap libcメモリマップを名前でフィルタリング
search -t string "PASS"メモリから文字列を検索
search -t bytes 0xdeadbeefメモリからバイトパターンを検索
distance ADDR1 ADDR22つのアドレス間のバイト距離
p2p MAP1 MAP22つのマッピング間のポインタチェーンを検出

ヒープ分析(glibc)

コマンド説明
heapヒープチャンクを列挙
binsすべてのフリービンを表示(fast、tcache、small、large、unsorted)
tcachetcacheを検査
fastbinsfastbinの内容を表示
malloc_chunk ADDRアドレスのチャンクヘッダをデコード
top_chunkトップ(wilderness)チャンクを表示
vis_heap_chunksヒープレイアウトを色で可視化
find_fake_fast ADDRfastbin偽チャンクターゲットを追跡

エクスプロイト開発

コマンド説明
cyclic 200De Bruijnパターンを生成(オフセットファインダー)
cyclic -l 0x6161616cパターン内の値のオフセットを検索
rop --grep "pop rdi"ROPガジェットを検索
ropgadgetガジェットをダンプ(ROPgadget統合)
checksecバイナリの軽減策を表示(NX、PIE、RELRO、canary)
gotGOTと解決されたアドレスを表示
pltPLTを表示
aslrデバッギー用のASLRを表示/切り替え
canary現在のスタックcanary値を表示

ブレークポイントとウォッチポイント

コマンド説明
b *0x401136絶対アドレスで中断
b mainシンボルで中断
breakrva 0x1136RVAで中断(PIEで便利)
watch GLOBAL値が変わるとき中断
rwatch ADDR読み取りアクセスで中断
ignore N COUNTブレークポイントをN回無視

一般的なワークフロー

# 保存されたリターンアドレスを上書きするための正確なオフセットを見つける
pwndbg> cyclic 200
pwndbg> r            # パターンを貼り付け、クラッシュ
pwndbg> cyclic -l $rsp   # オフセットを報告

# 軽減策を検査し、ワンガジェットフレンドリーなROPチェーンを探す
pwndbg> checksec
pwndbg> rop --grep "pop rdi"

# ヒープ・ユース・アフター・フリーを追跡する
pwndbg> vis_heap_chunks
pwndbg> bins

pwndbg vs GEF vs PEDA

機能pwndbgGEFPEDA
GDBサポートありありあり
LLDBサポートありなしなし
ヒープ分析深い(glibc)良好制限的
ROPツールビルトインビルトインビルトイン
アクティブ開発ありあり最小限

リソース