Brève introduction Tout d'abord qu'est ce qu'un buffer overflow? Et à quoi ça sert? Les buffer overflow sont des failles nous permettant d'exploiter une vulnérablilité presente dans un fichier binaire afin de pouvoir lui faire executer ce que l'on veut (enfin quasiment ^^).Le plus souvent on lui fait executer un shell, chose qui peut être très utile, par exemple si le binaire à des permissions SUID ou si il tourne sur un port en remote. Quelques notions de base à connaitre avant d'attaquer cet article: - La gestion de la mémoire - Le fonctionnement de la stack - Et quelques bases en assembleur Rappel Pour commencer je vais vous faire un petit rappel sur le déroulement de notre pile (stack) sur un programme qui va tout simplement attendre une entrée utilisateur (stdin) pour ensuite nous l'afficher (stdout) #include #include void vuln() { char buffer[32]; read(0, buffer, 128); puts(buffer); } int main() { vuln(); } Nous allons ensuite compiler ce programme sans aucune protections, et en 32bit gcc -m32 -fno-stack-protector -no-pie -zexecstack -o vuln vuln.c Executons ce programme: $ ./vuln AAAAAAAAAAA AAAAAAAAAAA $ Tout se déroule comme prévu Et voici à quoi la stack ressemblait lorsque nous avons entrée nos "A": 0xbfff0000: 41 41 41 41 0xbfff0004: 41 41 41 41 0xbfff0008: 41 41 41 00 ... 0xbfff0020: 30 00 ff bf <- sEBP 0xbfff0024: f0 84 04 08 <- sEIP Si pour vous tout est bon on peut donc passer à la suite!