Bonjour,
Je travaille en ce moment sur les buffers overflow, et j'ai le problème suivant :
Je ne comprend pas pourquoi le programme suivant ne fait pas un overflow "normal" (écrasement de l'adresse de retour, etc.)
Voici le programme en question :
Selon moi, et selon gdb, le système d'exploitation reserve 1 octet pour tmp, et 1 octet pour i. Lorsque je remplis ensuite tmp avec des A, il devrait écraser pas mal d'informations, y compris l'adresse de retour, et devrait finalement afficher un magnifique "Segmentation fault in ...".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void t(){ char tmp[3]; int i; for (i=0; i< 1000; i++) { tmp[i]='A'; } } int main(){ t(); return 0; }
Voila, mais ce n'est pas le cas, ou bien il faut forcer la boucle a 10000, et encore, le debug avec gdb montre qu'aucun registre n'est affecté !
Alors j'aurais voulu comprendre en quoi mon bout de code plus haut diffère de celui la, avec lequel je n'ai aucun probleme.
J'ai pensé au fait qu'il ne stockerait pas les informations au meme endroit (ie pas dans la stack), mais je n'ai rien trouvé sur internet confirmant cette information...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void t(){ char tmp[3]; char code[]="AAAAAAAAAAAAAAAAAAAAAAA"; strcpy(tmp,code); } int main(){ t(); return 0; }
Si vous pouviez m'éclairer.
- Tibap
$ uname -a >> Linux user 2.6.24-27-generic #1 SMP Wed Jan 27 23:54:28 UTC 2010 i686 GNU/Linux
$ gcc --version >> gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
Partager