En ce moment, je suis en train de préparer une démonstration de la "format string attack". Le but est de pouvoir lire les valeurs qui sont dans la pile d'exécution du programme. Donc, pour y parvenir j'utilise un petit programme C crée dans ce but (et trouver sur Internet) :
/*
* fmtme.c
* Format a value into a fixed-size buffer
*/
#include <stdio.h>
int main(int argc, char **argv){
char buf[100];
int x;
if(argc != 2)exit(1);
x = 1;
snprintf(buf, sizeof buf, argv[1]);
buf[sizeof buf - 1] = 0;
printf("buffer (%d): %s\n", strlen(buf), buf);
printf("x is %d/%#x (@ %p)\n", x, x, &x);
return 0;
}
Le programme fonctionne bien et voici sa trace d'exécution :
$ ./fmtme "aaaa %x %x %x %x %x %x %x %x %x"
buffer (49): aaaa 0 0 0 bf821020 bf820ff0 8048226 0 1 61616161
x is 1/0x1 (@ 0xbf820f68)
Mon problème est que dans l'exemple que j'ai trouvé, l'affichage des résultats est différent. Dans mon exemple, il a été exécuté sur une BSD/OS 4.1 et en voici le résultat :
% ./fmtme "aaaa %x %x"
buffer (15): aaaa 1 61616161
x is 1/0x1 (@ 0x804745c)
(1 est la valeur de x et 61616161 est l'affichage hexadécimal de aaaa passé en paramètre)
Donc j'aimerais savoir à quoi corresponde ces valeurs : "0 0 0 bf821020 bf820ff0 8048226 0" qui sont affichés avant les éléments de la pile. J'ai fait tous ces tests sur Backtrack 2, Debian 3.1 et fedora 7 (kernel 2.6) et j'obtiens des résultats similaires. Je vous remercie par avance pour votre aide.