Parte: 5 — Explotación de sistemas y binarios · Fuente: Andriesse, Practical Binary Analysis · docs de pwndbg ⏱️ Duración estimada: 110 min · Nivel: Fundamentos
Dominar GDB como herramienta de análisis dinámico y potenciarlo con pwndbg, el plugin estándar en el mundo del pwn. Aprenderás a poner breakpoints, avanzar instrucción a instrucción, examinar memoria y registros, e interpretar la vista de contexto (registros, stack, disassembly, backtrace) que pwndbg pinta en cada parada. Esta es la mesa de trabajo del resto de la parte.
Al finalizar, el alumno podrá:
break, run, continue, stepi, nexti, finish.x/, registros con info registers y el stack con stack.context, vmmap, telescope, search, cyclic.RIP en tiempo de ejecución.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Instalación de pwndbg | Contexto visual imprescindible para pwn |
| 2 | Breakpoints y watchpoints | Detener en el punto exacto de interés |
| 3 | stepi / nexti / finish | Avanzar a nivel de instrucción |
| 4 | x/ (examine) y formatos | Leer memoria en cualquier representación |
| 5 | context de pwndbg | Registros + stack + code de un vistazo |
| 6 | vmmap y telescope | Mapa de memoria y punteros encadenados |
| 7 | cyclic / cyclic -l | Localizar offsets de overflow al instante |
| 8 | Ajustar ASLR en depuración | Reproducibilidad durante el aprendizaje |
break *0x401136 rompe en una dirección exacta.x/ (examine): vuelca memoria con formato (x/16gx $rsp = 16 giant hex desde RSP). Clave: la
letra final es el tamaño (b/h/w/g) y la anterior el formato (x/d/i/s).cyclic -l.git clone https://github.com/pwndbg/pwndbg
cd pwndbg && ./setup.sh
# Verifica
echo "quit" | gdb -q ./frame # debe mostrar la cabecera pwndbg
Para reproducibilidad al aprender, desactiva ASLR solo dentro de GDB (pwndbg lo hace por defecto)
o globalmente en la VM: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space (revierte a 2 después).
Entorno propio.
c
// vuln.c
#include <stdio.h>
#include <string.h>
void win() { puts("¡controlaste el flujo!"); }
void vuln() { char buf[64]; gets(buf); }
int main(){ vuln(); return 0; }
bash
gcc -fno-stack-protector -no-pie -z execstack vuln.c -o vuln # solo laboratorio
Arranca en pwndbg: gdb -q ./vuln. Observa la cabecera y prueba context.
Genera un patrón y aliméntalo:
gdb
pwndbg> cyclic 200
pwndbg> run
# pega el patrón como entrada de gets
RIP/RSP y calcula el offset:gdb
pwndbg> cyclic -l 0x6161616c # devuelve el offset exacto al control de RIP
Explora el proceso: vmmap, telescope $rsp 20, info functions win para conocer la dirección de win.
Pon un breakpoint en vuln y avanza con nexti observando cómo RSP/RBP cambian en el prólogo.
Anota el offset hallado: lo usarás en las clases 119–120 para redirigir la ejecución a win.
x/.buf y observa cuándo se sobreescribe.search para encontrar la cadena "win" en memoria.vuln con disassemble vuln e identifica el call gets.stepi y nexti con call..gdbinit con tus breakpoints habituales.Usando cyclic, determina el offset exacto (en bytes) desde el inicio de buf hasta la dirección de
retorno de vuln.
Criterio de aceptación: el número obtenido con cyclic -l coincide con 64 + 8 (buffer + saved RBP)
y lo justificas con la vista de context.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| pwndbg no aparece | source no cargado; revisa ~/.gdbinit o reejecuta setup.sh |
cyclic -l da "not found" |
Pasaste el valor equivocado; usa el que quedó en RIP/RSP |
| Direcciones cambian cada corrida | ASLR activo; desactívalo o depura dentro de GDB |
x/s imprime basura |
Formato incorrecto; ese puntero no apunta a una cadena |
| El breakpoint nunca dispara | Símbolo inexistente o binario recompilado; rompe por dirección |
❓ ¿pwndbg, GEF o peda? Cualquiera sirve; pwndbg es el más usado hoy. No mezcles dos a la vez.
❓ ¿Por qué desactivo ASLR para aprender? Para que las direcciones sean estables entre corridas. En la explotación real lo tratarás como obstáculo (clases 122+).
❓ ¿gets es realista? Es un ejemplo didáctico; en binarios reales verás strcpy, sprintf,
read mal acotados, etc.
Clase 117 — El stack, los registros y las convenciones de llamada