pwndbg - GDB/LLDB Exploit Development Cheatsheet
pwndbg (ausgesprochen „pwn-dee-bee-gee”) ist ein Python-Plugin, das in GDB geladen wird — und jetzt auch in LLDB — um Exploit-Entwicklung und Reverse-Engineering viel weniger schmerzhaft zu machen. Es bietet Heap-Inspektion, ROP-Gadget-Suche, Register-/Stack-/Pointer-„Teleskopierung”, eine intelligente Kontextanzeige bei jedem Stopp und Dutzende Befehle, die Core-Debugger nie bereitgestellt haben. Es ist ein Nachfolger im Geist von PEDA und ein Geschwister zu GEF.
Installation
| Methode | Befehl |
|---|
| Setup-Skript (empfohlen) | git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh |
| Nix | nix profile install github:pwndbg/pwndbg |
| Arch (AUR) | yay -S pwndbg |
| Manuelles GDB-Laden | add source /path/to/pwndbg/gdbinit.py zu ~/.gdbinit |
| LLDB | add command script import /path/to/pwndbg/lldbinit.py zu ~/.lldbinit |
| Verifizieren | gdb starten — Sie sollten die pwndbg>-Eingabeaufforderung sehen |
Sitzung starten
| Befehl | Beschreibung |
|---|
gdb ./binary | Eine Binärdatei unter pwndbg laden |
gdb -p PID | An einen laufenden Prozess anhängen |
gdb ./binary core | Einen Core-Dump zur Post-Mortem-Analyse öffnen |
start | Ausführen und bei main unterbrechen |
entry | Ausführen und beim ELF-Einstiegspunkt unterbrechen |
r ARGS | Mit Argumenten ausführen |
starti | Bei der allerersten Instruktion stoppen |
Kontext & Navigation
| Befehl | Beschreibung |
|---|
context | Den vollständigen Kontext neu zeichnen (Regs, Disasm, Stack, Backtrace) |
context reg | Nur den Register-Bereich anzeigen |
ctx-watch EXPR | Einen Ausdruck zum Kontext-Watch-Bereich hinzufügen |
nextcall | Schrittweise bis zur nächsten call-Instruktion |
nextret | Schrittweise bis zum nächsten ret |
stepuntilasm mov | Schrittweise bis zu einem bestimmten Mnemonic |
xinfo ADDR | Erklären, worauf eine Adresse abgebildet ist (welche Zuordnung/Sektion) |
Speicherinspektion
| Befehl | Beschreibung |
|---|
telescope ADDR | Dereferenzieren und „teleskopieren” Sie eine Kette von Zeigern |
telescope $sp 20 | 20 Einträge vom Stack-Pointer teleskopieren |
hexdump ADDR | Hex+ASCII-Dump (der Befehl, den GDB nie hatte) |
vmmap | Zeige die virtuelle Speicherkarte des Prozesses |
vmmap libc | Filtere die Speicherkarte nach Name |
search -t string "PASS" | Speicher nach einer Zeichenkette durchsuchen |
search -t bytes 0xdeadbeef | Speicher nach einem Byte-Muster durchsuchen |
distance ADDR1 ADDR2 | Byte-Abstand zwischen zwei Adressen |
p2p MAP1 MAP2 | Zeiger-Ketten zwischen zwei Zuordnungen finden |
Heap-Analyse (glibc)
| Befehl | Beschreibung |
|---|
heap | Heap-Chunks auflisten |
bins | Zeige alle freien Bins (fast, tcache, small, large, unsorted) |
tcache | Inspiziere den tcache |
fastbins | Zeige fastbin-Inhalte |
malloc_chunk ADDR | Dekodiere einen Chunk-Header an einer Adresse |
top_chunk | Zeige den Top-(Wilderness-)Chunk |
vis_heap_chunks | Visualisiere das Heap-Layout mit Farben |
find_fake_fast ADDR | Suche nach fastbin-Fake-Chunk-Zielen |
Exploit-Entwicklung
| Befehl | Beschreibung |
|---|
cyclic 200 | Generiere ein De Bruijn-Muster (Offset-Finder) |
cyclic -l 0x6161616c | Schau den Offset eines Wertes im Muster nach |
rop --grep "pop rdi" | Suche ROP-Gadgets |
ropgadget | Dump-Gadgets (ROPgadget-Integration) |
checksec | Zeige Binär-Mitigationen (NX, PIE, RELRO, Canary) |
got | Zeige die GOT und aufgelöste Adressen |
plt | Zeige die PLT |
aslr | Zeige/umschalten Sie ASLR für den Debugee |
canary | Zeige den aktuellen Stack-Canary-Wert |
Breakpoints & Watchpoints
| Befehl | Beschreibung |
|---|
b *0x401136 | Breakpoint bei einer absoluten Adresse |
b main | Breakpoint bei einem Symbol |
breakrva 0x1136 | Breakpoint bei einer RVA (praktisch mit PIE) |
watch GLOBAL | Unterbrechen, wenn sich ein Wert ändert |
rwatch ADDR | Bei Lesezugriff unterbrechen |
ignore N COUNT | Ignoriere einen Breakpoint N-mal |
Häufige Workflows
# Finde den genauen Offset zum Überschreiben einer gespeicherten Rückgabeadresse
pwndbg> cyclic 200
pwndbg> r # Muster einfügen, Crash
pwndbg> cyclic -l $rsp # Offset melden
# Inspiziere Mitigationen, suche dann nach einer One-Gadget-freundlichen ROP-Kette
pwndbg> checksec
pwndbg> rop --grep "pop rdi"
# Durchlaufe eine Heap-Use-After-Free
pwndbg> vis_heap_chunks
pwndbg> bins
pwndbg vs GEF vs PEDA
| Funktion | pwndbg | GEF | PEDA |
|---|
| GDB-Unterstützung | Ja | Ja | Ja |
| LLDB-Unterstützung | Ja | Nein | Nein |
| Heap-Analyse | Tiefgreifend (glibc) | Gut | Begrenzt |
| ROP-Tools | Integriert | Integriert | Integriert |
| Aktive Entwicklung | Ja | Ja | Minimal |
Ressourcen