Smashing Stack sur Ubuntu 11.10

L’un de vous a-t-il rencontré le problème suivant lorsque vous essayez d’écraser le pointeur $esp ?

Bien sûr, essayer une taille de tampon légitime fonctionne toujours! Mais, lorsque vous essayez d’augmenter la taille du tampon pour remplacer $esp et que vous réussissez à toucher le premier octet, le deuxième octet ou le troisième octet de $esp cela fonctionne parfaitement. Mais, dès que vous essayez d’écraser les 4 octets entiers du $esp cela change totalement le contenu ainsi que l’adresse. Il ne montre plus 41 s car j’ai utilisé “A” pour remplir le tampon. J’ai joint une capture d’écran, peut-être que cela expliquera plus en détail. Merci a tous.

 #include  #include  int main(int argc, char** argv) { char buffer[500]; strcpy(buffer, argv[1]); return 0; } 

briser la tentative

Ceci est lié à l’implémentation de l’ émulation NX dans les kernelx non PAE Ubuntu 32 bits, et lorsque l’exception du processeur est déclenchée. Pour les régions de mémoire sous la ligne d’émulation NX (c’est-à-dire “dans” la zone NX émulée: de l’adresse 0 à la fin du segment de texte du programme – moins que l’adresse de fin 0x08049000 de ce binary dans /proc/$pid/maps ) , l’erreur de segmentation est transmise après que l’EIP a atterri sur l’adresse invalide réelle. Pour les adresses au-dessus de la ligne, le défaut est déclenché par un chemin différent qui signale la panne sans déplacer EIP vers l’adresse défaillante, en restant sur l’instruction “ret” qui mène à l’erreur.

Vous pouvez le voir dans gdb:

 (gdb) x/1i $pc => 0x8048454 : ret (gdb) info reg esp esp 0xbffff54c 0xbffff54c (gdb) x/wx $esp 0xbffff54c: 0x41414141 

Vous pouvez également voir la différence dans la façon dont les erreurs sont rapscopes dans la sortie de dmesg . C’est la sortie associée à la tentative “508”:

 [ 585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000] 

Et c’est pour “507”:

 [ 598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000] 

Si vous démarrez avec le kernel PAE installé, sudo apt-get install linux-image-$(uname -r)-pae , et vous avez un processeur compatible PAE, vous verrez le comportement sudo apt-get install linux-image-$(uname -r)-pae vous vous attendez (puisque l’émulation NX sera être désactivé au profit du matériel NX), et toutes les 4 tentatives échoueront avec les EIP attendus.