Le système d'exploitation que j'utilise actuellement est Ubuntu 14.04 64 bits avec sa version gcc 4.8.4. J'ai écrit un programme simple comme montré ci-dessous pour faire quelques tests liés au débordement de tampon, et d'une manière ou d'une autre j'ai trouvé que je ne pouvais pas déborder correctement une chaîne de caractères locale.Pourquoi ne puis-je pas désactiver la protection de la pile?
/*test.c*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[4];
strcpy(buffer, str);
return 1;
}
int main()
{
char str[]="123456789';
/* This is the maximum length the string
can be, which is 16 bytes including the null character at the end, and
any strings that are longer than this would result in a segmentation fault */
bof(str);
}
Ce programme a été compilé avec la commande
gcc -o test -fno-stack-protector test.c
de sorte que pile soi-disant protection aurait été désactivé. Selon mon observation, toutes les chaînes de longueur inférieure ou égale à 16 caractères (y compris le caractère nul) seraient acceptables; sinon, cela provoquerait une erreur de segmentation.
Des pensées pourquoi et comment pourrais-je le faire fonctionner? Merci d'avance!
Accéder à un tableau hors hors-limites est un comportement non défini ** ** comme l'étalon C. Pensez à la signification du mot "** undefined **". – Olaf
Merci d'avoir commenté. Je comprends que l'accès hors-limites d'adresses est un comportement indéfini, ou du moins je pense que je le fais. Corrigez-moi si je me trompe, mais les adresses hors-limites ne sont-elles pas essentiellement des blocs de mémoire stockant des données pouvant être accédés et modifiés? Donc, si j'ai activé la protection de pile, ce qui me permettrait théoriquement de jouer avec ces adresses hors limites, et si je suis assez méticuleux pour garder mon code en ligne, devrais-je pouvoir utiliser ces mémoires? – glenjoker
Si l'élément de pile auquel vous essayez d'accéder n'est pas mappé dans l'espace d'adressage actuel du processus, qu'espérez-vous exactement? autre qu'un signal? et pourquoi? – EJP