Buffer overflow: Bypass DEP/NX avec la ret2libc

Introduction

Dans cet article nous continuerons notre série d’article sur les stack buffer overflow, cette fois ci nous allons activer la protection DEP/NX et la contourner avec la technique appelée ret2libc.

Programme Vulnérable et DEP/NX

Voici le code source du programme vulnerable :

Il faut compiler le programme avec la commande suivante afin de désactiver les protections PIE et stack canary mais cette fois ci nous ne rendons pas la stack executable : gcc vuln.c -m32 -fno-stack-protector -no-pie -o vuln

Nous pouvons vérifier les proctections activées ou non à l’aide du programme checksec :

checksec vuln

Nous pouvons voir que le canary et PIE ne  sont pas activé mais que cette fois ci NX ( Non Executable ) l’est .

Nous allons ensuite désactiver temporairement l’ASLR qui est une protection du système d’exploitation permettant de rendre les adresses aléatoires. Nous allons le faire à l’aide de la commande suivante :

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

RET2LIBC

Pour exploiter le stack based buffer overflow dans ce programme vulnérable, nous ne pouvons pas placer de shellcode dans la pile comme on l’a fait dans le précèdent article car celle ci est non executable, il est donc impossible d’executer du code placé sur la pile.

Nous allons donc utiliser la technique ret2libc pour bypasser cette protection…

Le but de cette technique est d’appeler directement des functions depuis la libc.La libc est la bibliothèque standard du langage C, elle contient les fonctions utilisées dans vos programme C ( printf,scanf,etc.).

Comment fonctionne cette technique ?

La ret2libc est la methode qui consiste à placer une adresse d’une fonction de la libc sur l’adresse de retour pour l’appeler directement lors de l’instruction ret, nous allons par exemple utiliser la fonction system() avec comme argument une adresse vers une chaîne de caractères « /bin/sh ».

Maintenant, comment passer un argument à notre fonction system() ? C’est simple, lorsqu’une fonction est appelée avec un argument la pile ressemble à cela :

stack ret2libc

L’adresse de retour est mise dans la pile elle sera « popé » avec l’instruction ret qui est un équivalent de « pop eip », les arguments se trouve ensuite dans la pile.

Nous allons donc ecrire dans notre buffer les A pour arriver à l’offset de l’adresse de retour, puis nous allons ecraser celle ci par l’adresse de la fonction system, ensuite « JUNK » pour l’adresse lancée après la fonction system, car celle si ne retournera jamais puisqu’elle executera /bin/sh,puis l’adresse d’une chaîne « /bin/sh » en premier argument.

Exploitation du buffer overflow

Nous utilisons la même méthode que dans les articles précèdents pour trouver l’offset pour écraser la valeur de retour : 76 caractères

Maintenant cherchons l’adresse de la fonction system dans gdb :

L’adresse de system est donc 0xf7df37d0.

Ensuite cherchons l’adresse d’une chaîne « /bin/sh » dans gdb :

L’adresse de la chaîne /bin/sh est donc 0xf7f2fe2a
Il nous reste plus qu’à exploiter notre programme avec l’exploit suivant :

Voilà nous obtenons un shell !

J’espère que cet article vous aura plus , à bientôt !

Add a Comment

Votre adresse de messagerie ne sera pas publiée.