Я занимаюсь исследованием переполнения буфера, и мне было интересно, как работает защита от перебора стека
У меня есть этот код:
int main( )
{
char Buf[16];
printf(“Digite o seu nome: ”);
gets(Buf);
printf(“%s”,Buf);
return 0;
}
Я компилирую его с помощью gcc
и затем я вставил несколько символов, чтобы заполнить буфер
Сначала я поставил 16 символов
$ ./Exemplo1
Digite o seuome: AAAAAAAAAAAAAAAA
Ола АААААААААААААААА
Это нормально, потому что буфер имеет правильный размер
Далее я попробую 24 символа
$ ./Exemplo1
Digite o seu nome: AAAAAAAAAAAAAAAAAAAAAAAA
Ола АААААААААААААААААААААААА
Почему это все еще работает?
не должно ли это привести к завершению программы !?
Программа прекращает работу, только когда я ставлю 25 или более символов
. / Exemplo1
Digite o seu nome: AAAAAAAAAAAAAAAAAAAAAAAAA
Ола ААААААААААААААААААААААААА
* обнаружено разрушение стека *: ./Exemplo1 прекращено
Почему? что после буфера, который не является адресом возврата?
То, о чем я читал и что я понимаю, это то, что оно должно иметь канареечное значение, но оно должно завершить программу, если это значение изменилось, и с 24 символами, записанными в буфер, не должно ли это все же дать мне обнаружение разрушения стека если адрес возврата не изменился, но канарское значение изменилось.
Спасибо.