Le dépassement de tampon n’a pas eu lieu

J’ai essayé cet exemple de code c:

int main() { int array[5]; int i; for (i = 0; i <= 255; i++) { array[i] = 10; } } 

et le comstackr en utilisant:

 gcc -m32 -o a.out buffer2.c 

Ma question est pourquoi il n’y a pas de faute de segmentation?

j’utilise kali linux 64

vendor_id: GenuineIntel

nom du modèle: processeur Intel M3 Core i3 350 @ 2,27 GHz

Architecture: x86_64

Mode (s) opérationnel (s) de la CPU: 32 bits, 64 bits

Ordre des octets: petit Endian


J’ai édité le code en ajoutant ces deux lignes:

 int main() { int x = 12; int array[5]; int i; for (i = 0; i <= 255; i++) { array[i] = 10; } printf("%d\n", x); } 

et c’est le résultat:

 10 Segmentation fault 

Il n’y a pas de vérification des limites d’exécution dans C. L’écriture dans des éléments situés en dehors des limites d’un tableau constitue un comportement indéfini . Un comportement indéfini signifie que tout peut arriver en ce qui concerne la norme. Ainsi, bien qu’une erreur de segmentation soit assez probable, elle n’est en aucun cas garantie.

Ce n’est pas parce qu’il n’ya pas eu de faute de segmentation qu’il n’ya pas eu de dépassement de tampon. Il y avait certainement. Cela n’a simplement pas entraîné de faute de segmentation cette fois-ci. Ce type d’erreur est grave et peut entraîner de nombreux problèmes de sécurité. La morale de l’histoire est de ne jamais causer de débordement de mémoire tampon. Ce n’est pas sûr et vous ne pouvez pas compter sur C pour vous protéger.

Essayer:

 sudo echo 0 > /proc/sys/kernel/randomize_va_space 

Et comstackr à nouveau comme ceci:

 gcc buffer2.c -o buffer2 -fno-stack-protector