pwndbg - Cheatsheet GDB/LLDB per lo sviluppo di exploit
pwndbg (pronunciato “pwn-dee-bee-gee”) è un plugin Python che si carica in GDB — e ora anche in LLDB — per rendere lo sviluppo di exploit e l’ingegneria inversa molto meno dolorosi. Aggiunge ispezione dell’heap, ricerca di gadget ROP, “telescoping” di registri/stack/puntatori, un display di contesto intelligente ad ogni stop, e dozzine di comandi che i debugger core non hanno mai fornito. È un successore spirituale di PEDA e un fratello di GEF.
Installation
| Metodo | Comando |
|---|
| Setup script (consigliato) | git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh |
| Nix | nix profile install github:pwndbg/pwndbg |
| Arch (AUR) | yay -S pwndbg |
| Manual GDB load | aggiungi source /path/to/pwndbg/gdbinit.py a ~/.gdbinit |
| LLDB | aggiungi command script import /path/to/pwndbg/lldbinit.py a ~/.lldbinit |
| Verify | avvia gdb — dovresti vedere il prompt pwndbg> |
Avvio di una sessione
| Comando | Descrizione |
|---|
gdb ./binary | Carica un binario sotto pwndbg |
gdb -p PID | Si collega a un processo in esecuzione |
gdb ./binary core | Apri un core dump per analisi post-mortem |
start | Esegui e interrompi a main |
entry | Esegui e interrompi all’entry point ELF |
r ARGS | Esegui con argomenti |
starti | Ferma alla primissima istruzione |
Contesto e navigazione
| Comando | Descrizione |
|---|
context | Ridisegna il contesto completo (regs, disasm, stack, backtrace) |
context reg | Mostra solo il riquadro dei registri |
ctx-watch EXPR | Aggiungi un’espressione al riquadro di osservazione del contesto |
nextcall | Esegui fino alla prossima istruzione call |
nextret | Esegui fino al prossimo ret |
stepuntilasm mov | Esegui fino a una data mnemonico |
xinfo ADDR | Spiega a cosa si mappa un indirizzo (quale mapping/sezione) |
Ispezione della memoria
| Comando | Descrizione |
|---|
telescope ADDR | Dereferenzia e “telescopia” una catena di puntatori |
telescope $sp 20 | Telescopia 20 voci dal puntatore dello stack |
hexdump ADDR | Dump esadecimale + ASCII (il comando che GDB non ha mai avuto) |
vmmap | Mostra la mappa della memoria virtuale del processo |
vmmap libc | Filtra la mappa di memoria per nome |
search -t string "PASS" | Cerca una stringa in memoria |
search -t bytes 0xdeadbeef | Cerca un modello di byte in memoria |
distance ADDR1 ADDR2 | Distanza in byte tra due indirizzi |
p2p MAP1 MAP2 | Trova catene di puntatori tra due mappings |
Analisi dell’Heap (glibc)
| Comando | Descrizione |
|---|
heap | Elenca i chunk dell’heap |
bins | Mostra tutti i bin liberi (fast, tcache, small, large, unsorted) |
tcache | Ispeziona il tcache |
fastbins | Mostra il contenuto dei fastbin |
malloc_chunk ADDR | Decodifica un’intestazione di chunk a un indirizzo |
top_chunk | Mostra il chunk top (wilderness) |
vis_heap_chunks | Visualizza il layout dell’heap con colori |
find_fake_fast ADDR | Cerca target di fake-chunk fastbin |
Sviluppo di exploit
| Comando | Descrizione |
|---|
cyclic 200 | Genera un modello De Bruijn (offset finder) |
cyclic -l 0x6161616c | Cercaa l’offset di un valore nel modello |
rop --grep "pop rdi" | Cerca gadget ROP |
ropgadget | Dumpa i gadget (integrazione ROPgadget) |
checksec | Mostra le mitigazioni binarie (NX, PIE, RELRO, canary) |
got | Mostra il GOT e gli indirizzi risolti |
plt | Mostra il PLT |
aslr | Mostra/attiva ASLR per il debugee |
canary | Mostra il valore del canary dello stack corrente |
Breakpoint e Watchpoint
| Comando | Descrizione |
|---|
b *0x401136 | Interrompi a un indirizzo assoluto |
b main | Interrompi a un simbolo |
breakrva 0x1136 | Interrompi a un RVA (utile con PIE) |
watch GLOBAL | Interrompi quando un valore cambia |
rwatch ADDR | Interrompi sull’accesso in lettura |
ignore N COUNT | Ignora un breakpoint N volte |
Workflow comuni
# Trova l'offset esatto per sovrascrivere un indirizzo di ritorno salvato
pwndbg> cyclic 200
pwndbg> r # incolla il pattern, crash
pwndbg> cyclic -l $rsp # segnala l'offset
# Ispeziona le mitigazioni, poi cerca una catena ROP amichevole per one-gadget
pwndbg> checksec
pwndbg> rop --grep "pop rdi"
# Percorri un heap use-after-free
pwndbg> vis_heap_chunks
pwndbg> bins
pwndbg vs GEF vs PEDA
| Funzione | pwndbg | GEF | PEDA |
|---|
| Supporto GDB | Sì | Sì | Sì |
| Supporto LLDB | Sì | No | No |
| Analisi heap | Profonda (glibc) | Buona | Limitata |
| Strumenti ROP | Integrati | Integrati | Integrati |
| Sviluppo attivo | Sì | Sì | Minimo |
Risorse