gets (s) lit une ligne de stdin dans le tampon pointé par s jusqu'à soit une nouvelle ligne de fin soit EOF, qu'elle remplace par '\ 0'. Aucune vérification pour dépassement de la mémoire tampon est réalisée
http://linux.die.net/man/3/gets
Lorsque vous exécutez obtient, est entrée dans le tampon pointé par s. Ensuite, il ajoute un \ 0. Seul le 't' est à l'intérieur du tampon d'entrée. Le reste, est situé sur la mémoire contiguë sur la pile. Print0 imprime "test", car c'est ce qu'il peut lire à partir de s jusqu'à la première \ 0. Mais les "est \ 0" sont en dehors du tampon. Lorsque vous le déboguez, l'entrée ne pointe que vers un seul caractère, c'est tout ce que vous pouvez voir.
Il est important de jeter un coup d'œil sur le "Aucune vérification du dépassement de tampon n'est effectuée". Cela signifie que la fonction ne se soucie pas vraiment si vous avez alloué de la mémoire pour votre entrée. Il va commencer à tout copier à partir du point que vous indiquez. Si vous ne faites pas attention, votre contribution peut passer sur des informations importantes. Dans le pire des cas, ce sera l'adresse de retour pour votre fonction (où vous utilisez get). Quelqu'un qui "fait juste" cette erreur, dira "wtf se passe". Quelqu'un qui le fait intentionnellement, pointera votre adresse de retour à une partie spécifique, et exécuter du code situé là.
More on Buffer Overflow.
Je sens un dépassement de tampon. – Tom
Vraiment GRANDE odeur! – mmmmmmmm