pwndbg - Antisèche Développement d’Exploits GDB/LLDB
pwndbg (prononcé “pwn-dee-bee-gee”) est un plugin Python qui se charge dans GDB — et maintenant LLDB — pour rendre le développement d’exploits et l’ingénierie inverse beaucoup moins douloureux. Il ajoute l’inspection du heap, la recherche de gadgets ROP, le “telescoping” des registres/pile/pointeurs, un affichage de contexte intelligent à chaque arrêt, et des dizaines de commandes que les debuggers ne fournirent jamais. C’est un successeur spirituel de PEDA et un frère de GEF.
Installation
| Méthode | Commande |
|---|
| Script d’installation (recommandé) | git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh |
| Nix | nix profile install github:pwndbg/pwndbg |
| Arch (AUR) | yay -S pwndbg |
| Chargement GDB manuel | ajouter source /path/to/pwndbg/gdbinit.py à ~/.gdbinit |
| LLDB | ajouter command script import /path/to/pwndbg/lldbinit.py à ~/.lldbinit |
| Vérification | démarrer gdb — vous devriez voir l’invite pwndbg> |
Démarrage d’une Session
| Commande | Description |
|---|
gdb ./binary | Charger un binaire sous pwndbg |
gdb -p PID | Attacher à un processus en cours d’exécution |
gdb ./binary core | Ouvrir un dump mémoire pour l’analyse post-mortem |
start | Exécuter et arrêter à main |
entry | Exécuter et arrêter au point d’entrée ELF |
r ARGS | Exécuter avec des arguments |
starti | S’arrêter à la toute première instruction |
Contexte et Navigation
| Commande | Description |
|---|
context | Redessiner le contexte complet (registres, désassembly, pile, backtrace) |
context reg | Afficher uniquement le volet des registres |
ctx-watch EXPR | Ajouter une expression au volet de surveillance du contexte |
nextcall | Exécuter pas à pas jusqu’à la prochaine instruction call |
nextret | Exécuter pas à pas jusqu’au prochain ret |
stepuntilasm mov | Exécuter pas à pas jusqu’à un mnémonique donné |
xinfo ADDR | Expliquer à quoi une adresse correspond (quel mappage/section) |
Inspection Mémoire
| Commande | Description |
|---|
telescope ADDR | Déréférencer et “telescoper” une chaîne de pointeurs |
telescope $sp 20 | Telescoper 20 entrées à partir du pointeur de pile |
hexdump ADDR | Dump hex+ASCII (la commande que GDB n’a jamais eu) |
vmmap | Afficher la carte mémoire virtuelle du processus |
vmmap libc | Filtrer la carte mémoire par nom |
search -t string "PASS" | Chercher une chaîne en mémoire |
search -t bytes 0xdeadbeef | Chercher un motif d’octets en mémoire |
distance ADDR1 ADDR2 | Distance en octets entre deux adresses |
p2p MAP1 MAP2 | Trouver des chaînes de pointeurs entre deux mappages |
Analyse du Heap (glibc)
| Commande | Description |
|---|
heap | Lister les chunks de heap |
bins | Afficher tous les bins libres (fast, tcache, small, large, unsorted) |
tcache | Inspecter le tcache |
fastbins | Afficher le contenu des fastbins |
malloc_chunk ADDR | Décoder un en-tête de chunk à une adresse |
top_chunk | Afficher le chunk supérieur (wilderness) |
vis_heap_chunks | Visualiser la disposition du heap avec des couleurs |
find_fake_fast ADDR | Chercher les cibles de fake-chunk fastbin |
Développement d’Exploits
| Commande | Description |
|---|
cyclic 200 | Générer un motif De Bruijn (chercheur de décalage) |
cyclic -l 0x6161616c | Chercher le décalage d’une valeur dans le motif |
rop --grep "pop rdi" | Chercher des gadgets ROP |
ropgadget | Dumper les gadgets (intégration ROPgadget) |
checksec | Afficher les mitigations binaires (NX, PIE, RELRO, canary) |
got | Afficher la GOT et les adresses résolues |
plt | Afficher la PLT |
aslr | Afficher/basculer ASLR pour le debugee |
canary | Afficher la valeur actuelle du canary de pile |
Points d’Arrêt et Watchpoints
| Commande | Description |
|---|
b *0x401136 | Arrêter à une adresse absolue |
b main | Arrêter à un symbole |
breakrva 0x1136 | Arrêter à une RVA (pratique avec PIE) |
watch GLOBAL | Arrêter quand une valeur change |
rwatch ADDR | Arrêter lors d’un accès en lecture |
ignore N COUNT | Ignorer un point d’arrêt N fois |
Flux de Travail Courants
# Trouver le décalage exact pour écraser une adresse de retour sauvegardée
pwndbg> cyclic 200
pwndbg> r # coller le motif, crash
pwndbg> cyclic -l $rsp # rapporter le décalage
# Inspecter les mitigations, puis chercher une chaîne ROP friendly one-gadget
pwndbg> checksec
pwndbg> rop --grep "pop rdi"
# Parcourir une use-after-free du heap
pwndbg> vis_heap_chunks
pwndbg> bins
pwndbg vs GEF vs PEDA
| Fonctionnalité | pwndbg | GEF | PEDA |
|---|
| Support GDB | Oui | Oui | Oui |
| Support LLDB | Oui | Non | Non |
| Analyse du heap | Profonde (glibc) | Bonne | Limitée |
| Outils ROP | Intégrés | Intégrés | Intégrés |
| Développement actif | Oui | Oui | Minimal |
Ressources