[BackdoorCTF 2017] Just do it – pwn250

Un des challenges que j’ai réussi dans le BackdoorCTF est le pwn Just do it qui comptait pour 250 points.

Comme vous pouvez le voir si dessus la protection NX est activé , nous ne pourrons donc pas exécuter un shellcode depuis la pile.

 

Lançons tout d’abord l’exécutable, il demande à recevoir un message. Si l’ont rentre beaucoup de caractères nous avons une segmentation fault, envoyons un pattern dans GDB pour trouver combien de caractères sont nécessaire pour écraser la valeur de retour : 112 .

Avant d’écraser la valeur de retour avec l’adresse de la fonction system en faisait un ret2libc, nous devons d’abord recuperer l’adresse de base de la libc pour ensuite calculer l’adresse de la fonction system et d’une chaine « /bin/sh ».

Pour cela nous allons appeler la fonction write comme ceci  write(1,READ_GOT_ADDDRESS,4);  le 1 est la sortie standard, le deuxieme argument est l’addresse de read dans la Global Offset Table et 4 la longueur d’un entier en architecture 32bits.

Cet appel nous donnera l’adresse de la fonction read contenue dans la GOT :

Nous retournons au début de la fonction main une fois l’adresse récupérée puis nous calculons l’adresse de la base de libc puis cette de system et de /bin/sh.
Pour récupérer les offset il suffit d’ouvrir le libc.so.6 dans IDA et rechercher la fonction system ainsi qu’une chaîne de caractère « /bin/sh ».

 

Maintenant nous avons tout ce qu’il faut pour rediriger l’exécution :

Cette fois ci il n’y à que 104 caractères à écrire pour écraser l’adresse de retour, nous l’avons vérifié avec gdb et un pattern comme au début de l’article.

Lançons notre binaire, nous obtenons un shell ! Challenge réussi !

Voici le script complet :

 

Add a Comment

Votre adresse de messagerie ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.