pwndbg - Hoja de Referencia de Desarrollo de Exploits con GDB/LLDB
pwndbg (pronunciado “pwn-dee-bee-gee”) es un complemento de Python que se carga en GDB — y ahora en LLDB — para hacer mucho menos doloroso el desarrollo de exploits y la ingeniería inversa. Añade inspección de heap, búsqueda de gadgets ROP, “telescopio” de registros/pila/punteros, una visualización de contexto inteligente en cada parada, y docenas de comandos que los depuradores base nunca proporcionaron. Es un sucesor en espíritu de PEDA y un hermano de GEF.
Instalación
| Método | Comando |
|---|
| Script de instalación (recomendado) | git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh |
| Nix | nix profile install github:pwndbg/pwndbg |
| Arch (AUR) | yay -S pwndbg |
| Carga manual en GDB | añade source /path/to/pwndbg/gdbinit.py a ~/.gdbinit |
| LLDB | añade command script import /path/to/pwndbg/lldbinit.py a ~/.lldbinit |
| Verificar | inicia gdb — deberías ver el prompt pwndbg> |
Iniciar una Sesión
| Comando | Descripción |
|---|
gdb ./binary | Cargar un binario bajo pwndbg |
gdb -p PID | Adjuntar a un proceso en ejecución |
gdb ./binary core | Abrir un volcado de núcleo para análisis post-mortem |
start | Ejecutar y detenerse en main |
entry | Ejecutar y detenerse en el punto de entrada del ELF |
r ARGS | Ejecutar con argumentos |
starti | Detenerse en la primera instrucción |
Contexto y Navegación
| Comando | Descripción |
|---|
context | Redibujar el contexto completo (registros, desensamblado, pila, backtrace) |
context reg | Mostrar solo el panel de registros |
ctx-watch EXPR | Añadir una expresión al panel de observación del contexto |
nextcall | Avanzar hasta la siguiente instrucción call |
nextret | Avanzar hasta el siguiente ret |
stepuntilasm mov | Avanzar hasta un mnemónico dado |
xinfo ADDR | Explicar a qué corresponde una dirección (qué mapeo/sección) |
Inspección de Memoria
| Comando | Descripción |
|---|
telescope ADDR | Desreferenciar y “telescopiar” una cadena de punteros |
telescope $sp 20 | Telescopiar 20 entradas desde el puntero de pila |
hexdump ADDR | Volcado hex+ASCII (el comando que GDB nunca tuvo) |
vmmap | Mostrar el mapa de memoria virtual del proceso |
vmmap libc | Filtrar el mapa de memoria por nombre |
search -t string "PASS" | Buscar una cadena en la memoria |
search -t bytes 0xdeadbeef | Buscar un patrón de bytes en la memoria |
distance ADDR1 ADDR2 | Distancia en bytes entre dos direcciones |
p2p MAP1 MAP2 | Encontrar cadenas de punteros entre dos mapeos |
Análisis de Heap (glibc)
| Comando | Descripción |
|---|
heap | Listar los chunks del heap |
bins | Mostrar todos los bins libres (fast, tcache, small, large, unsorted) |
tcache | Inspeccionar el tcache |
fastbins | Mostrar el contenido de los fastbins |
malloc_chunk ADDR | Decodificar el encabezado de un chunk en una dirección |
top_chunk | Mostrar el chunk superior (wilderness) |
vis_heap_chunks | Visualizar el diseño del heap con colores |
find_fake_fast ADDR | Buscar objetivos de chunk falso para fastbin |
Desarrollo de Exploits
| Comando | Descripción |
|---|
cyclic 200 | Generar un patrón De Bruijn (buscador de desplazamientos) |
cyclic -l 0x6161616c | Buscar el desplazamiento de un valor en el patrón |
rop --grep "pop rdi" | Buscar gadgets ROP |
ropgadget | Volcar gadgets (integración con ROPgadget) |
checksec | Mostrar las mitigaciones del binario (NX, PIE, RELRO, canary) |
got | Mostrar la GOT y las direcciones resueltas |
plt | Mostrar la PLT |
aslr | Mostrar/alternar ASLR para el proceso depurado |
canary | Mostrar el valor actual del canario de pila |
Puntos de Interrupción y Observación
| Comando | Descripción |
|---|
b *0x401136 | Punto de interrupción en una dirección absoluta |
b main | Punto de interrupción en un símbolo |
breakrva 0x1136 | Punto de interrupción en una RVA (útil con PIE) |
watch GLOBAL | Detenerse cuando cambia un valor |
rwatch ADDR | Detenerse en un acceso de lectura |
ignore N COUNT | Ignorar un punto de interrupción N veces |
Flujos de Trabajo Comunes
# Encontrar el desplazamiento exacto para sobrescribir una dirección de retorno guardada
pwndbg> cyclic 200
pwndbg> r # pega el patrón, provoca el fallo
pwndbg> cyclic -l $rsp # reporta el desplazamiento
# Inspeccionar las mitigaciones y luego buscar una cadena ROP compatible con one-gadget
pwndbg> checksec
pwndbg> rop --grep "pop rdi"
# Recorrer un use-after-free de heap
pwndbg> vis_heap_chunks
pwndbg> bins
pwndbg frente a GEF frente a PEDA
| Característica | pwndbg | GEF | PEDA |
|---|
| Compatibilidad con GDB | Sí | Sí | Sí |
| Compatibilidad con LLDB | Sí | No | No |
| Análisis de heap | Profundo (glibc) | Bueno | Limitado |
| Herramientas de ROP | Integradas | Integradas | Integradas |
| Desarrollo activo | Sí | Sí | Mínimo |
Recursos