Les Buffers Overflows Techniques et évolution par Raphaël GERMON

Les buffers Overflows

Voici la définition de wikipedia d'un Buffer Overflow :
En informatique, un dépassement de tampon ou débordement de tampon (en anglais, buffer overflow) est un bug par lequel un processus, lors de l'écriture dans un tampon, écrit à l'extérieur de l'espace alloué au tampon, écrasant ainsi des informations nécessaires au processus. Lorsque le bug se produit non intentionnellement, le comportement de l'ordinateur devient imprévisible. Il en résulte souvent un blocage du programme, voire de tout le système. Le bug peut aussi être provoqué intentionnellement et être exploité pour violer la politique de sécurité d'un système. Cette technique est couramment utilisée par les pirates. La stratégie de l'attaquant est alors de détourner le programme bugué en lui faisant exécuter des instructions qu'il a introduites dans le processus.

Si vous avez compris la page sur la mémoire adressable vous devez avoir une petite idée de comment il est possible d'exploiter un dépassement de tampon pour prendre le contrôle d'un processus. En effet, certaines fonctions du langage C comme strcpy() ne vérifie pas la taille de la chaine à traiter, il est donc possible d'écraser la mémoire du processus en envoyant une chaine trop longue, et ainsi écraser l'adresse de retour de la fonction, ce qui permettra de la remplacer et controler les prochaines exécutions qu'on souhaitent réaliser après l'exécution de la fonction.
Pour illustrer cette explication voici un petit bout de code C qui utilise cette fonction et qui fonctionne très bien avec un argument de 12 caractères mais qui va corrompre la pile si on lui passe un argument plus grand.



Voici une illustration de la mémoire quand strcpy() a copié une chaine normale, ici tout va bien.

schéma de la pile
La pile n'est pas corrompue


On peut observer que le message « hello » passé en argument est stocké en mémoire et qu'il ne dépasse pas la taille allouée pour la variable.
L'adresse de retour n'est pas corrompue et à la fin de l'exécution de la fonction fil on pourra donc retourner dans la fonction appelante.

schéma de la pile
La pile est corrompue




Par contre dans ce deuxième exemple on peut voir qu'on a passé une chaine trop longue à strcpy() et que cette dernière l'a bien stocké sans faire de vérification.
Il y a donc une surcharge de la pile, la chaine copiée se terminait par \x08\x35\xC0\x80 qui correspond à une adresse mémoire, et celle ci va remplacer l'adresse de retour d'origine.


Cet exemple vous permet de comprendre facilement le principe d'un dépassement de tampon et son exploitation.
Je vous invite maintenant à consulter la page sur les shellcodes qui explique comment il est possible d'injecter du code exécutable en mémoire.
Si vous avez bien suivi vous avez compris qu'il suffira ensuite de faire pointer l'adresse de retour sur ce code;-)