我正在研究缓冲区溢出问题,并想知道堆栈保护如何工作。以下是相关代码:
int main( )
{
char Buf[16];
printf(“Digite o seu nome: ”);
gets(Buf);
printf(“%s”,Buf);
return 0;
}
我使用gcc编译它
然后我放入一堆字符来填充缓冲区
首先我放了16个字符
$ ./Exemplo1
Digite o seu nome: AAAAAAAAAAAAAAAA
Ola AAAAAAAAAAAAAAAA
这很好,因为缓冲区的大小是正确的
接下来我尝试24个字符
$ ./Exemplo1
Digite o seu nome: AAAAAAAAAAAAAAAAAAAAAAAA
Ola AAAAAAAAAAAAAAAAAAAAAAAA
为什么它仍然有效?
难道这不应该导致程序终止吗!?
只有当我输入25个或更多字符时,它才终止程序
./Exemplo1
Digite o seu nome: AAAAAAAAAAAAAAAAAAAAAAAAA
Ola AAAAAAAAAAAAAAAAAAAAAAAAA
* stack smashing detected *: ./Exemplo1 终止
为什么?在缓冲区之后有什么不是返回地址的东西?我读到的和我理解的是它应该有一个canary值,但如果那个值已经改变,它应该终止程序,并且用24个字符写入缓冲区,即使返回地址没有改变,但canary值确实改变了,它仍然不会给我一个stack smashing detected。
谢谢。