Zum Inhalt springen

pwndbg - GDB/LLDB Exploit Development Cheatsheet

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

MethodeBefehl
Setup-Skript (empfohlen)git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh
Nixnix profile install github:pwndbg/pwndbg
Arch (AUR)yay -S pwndbg
Manuelles GDB-Ladenadd source /path/to/pwndbg/gdbinit.py zu ~/.gdbinit
LLDBadd command script import /path/to/pwndbg/lldbinit.py zu ~/.lldbinit
Verifizierengdb starten — Sie sollten die pwndbg>-Eingabeaufforderung sehen

Sitzung starten

BefehlBeschreibung
gdb ./binaryEine Binärdatei unter pwndbg laden
gdb -p PIDAn einen laufenden Prozess anhängen
gdb ./binary coreEinen Core-Dump zur Post-Mortem-Analyse öffnen
startAusführen und bei main unterbrechen
entryAusführen und beim ELF-Einstiegspunkt unterbrechen
r ARGSMit Argumenten ausführen
startiBei der allerersten Instruktion stoppen

Kontext & Navigation

BefehlBeschreibung
contextDen vollständigen Kontext neu zeichnen (Regs, Disasm, Stack, Backtrace)
context regNur den Register-Bereich anzeigen
ctx-watch EXPREinen Ausdruck zum Kontext-Watch-Bereich hinzufügen
nextcallSchrittweise bis zur nächsten call-Instruktion
nextretSchrittweise bis zum nächsten ret
stepuntilasm movSchrittweise bis zu einem bestimmten Mnemonic
xinfo ADDRErklären, worauf eine Adresse abgebildet ist (welche Zuordnung/Sektion)

Speicherinspektion

BefehlBeschreibung
telescope ADDRDereferenzieren und „teleskopieren” Sie eine Kette von Zeigern
telescope $sp 2020 Einträge vom Stack-Pointer teleskopieren
hexdump ADDRHex+ASCII-Dump (der Befehl, den GDB nie hatte)
vmmapZeige die virtuelle Speicherkarte des Prozesses
vmmap libcFiltere die Speicherkarte nach Name
search -t string "PASS"Speicher nach einer Zeichenkette durchsuchen
search -t bytes 0xdeadbeefSpeicher nach einem Byte-Muster durchsuchen
distance ADDR1 ADDR2Byte-Abstand zwischen zwei Adressen
p2p MAP1 MAP2Zeiger-Ketten zwischen zwei Zuordnungen finden

Heap-Analyse (glibc)

BefehlBeschreibung
heapHeap-Chunks auflisten
binsZeige alle freien Bins (fast, tcache, small, large, unsorted)
tcacheInspiziere den tcache
fastbinsZeige fastbin-Inhalte
malloc_chunk ADDRDekodiere einen Chunk-Header an einer Adresse
top_chunkZeige den Top-(Wilderness-)Chunk
vis_heap_chunksVisualisiere das Heap-Layout mit Farben
find_fake_fast ADDRSuche nach fastbin-Fake-Chunk-Zielen

Exploit-Entwicklung

BefehlBeschreibung
cyclic 200Generiere ein De Bruijn-Muster (Offset-Finder)
cyclic -l 0x6161616cSchau den Offset eines Wertes im Muster nach
rop --grep "pop rdi"Suche ROP-Gadgets
ropgadgetDump-Gadgets (ROPgadget-Integration)
checksecZeige Binär-Mitigationen (NX, PIE, RELRO, Canary)
gotZeige die GOT und aufgelöste Adressen
pltZeige die PLT
aslrZeige/umschalten Sie ASLR für den Debugee
canaryZeige den aktuellen Stack-Canary-Wert

Breakpoints & Watchpoints

BefehlBeschreibung
b *0x401136Breakpoint bei einer absoluten Adresse
b mainBreakpoint bei einem Symbol
breakrva 0x1136Breakpoint bei einer RVA (praktisch mit PIE)
watch GLOBALUnterbrechen, wenn sich ein Wert ändert
rwatch ADDRBei Lesezugriff unterbrechen
ignore N COUNTIgnoriere 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

FunktionpwndbgGEFPEDA
GDB-UnterstützungJaJaJa
LLDB-UnterstützungJaNeinNein
Heap-AnalyseTiefgreifend (glibc)GutBegrenzt
ROP-ToolsIntegriertIntegriertIntegriert
Aktive EntwicklungJaJaMinimal

Ressourcen