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