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