我正在做一些关于缓冲区溢出的研究,我想知道堆栈粉碎保护是如何工作的
我有这个代码:
int main( )
{
char Buf[16];
printf(“Digite o seu nome: ”);
gets(Buf);
printf(“%s”,Buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用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
*堆栈粉碎检测*:./ .Exmplo1终止
为什么?什么是缓冲区后不是返回地址?我读到的以及我认为理解的是它应该有一个金丝雀值,但如果该值已经改变并且将24个字符写入缓冲区它应该终止程序它应该不会给我一个堆栈粉碎检测甚至如果返回地址没有改变但金丝雀值没有改变.
谢谢.
Iam学习汇编,我发现了如何获得用户输入
mov al, 3 ; system call number (sys_read)
xor bl, bl ; file descriptor 0 (stdin)
mov rcx, buf ; buffer to store input
mov dl, 4 ; Lenght of buffer
int 0x80 ; interrupt
Run Code Online (Sandbox Code Playgroud)
但实际上这是一个正确的字符串?我的问题是我如何得到一个整数值...所以,如果我输入100我怎么得到值64h所以我可以添加,减去等而不是一个字符串,每个字节是数字的ascii表示,然后如何做我输出一个像64h的值到屏幕,它显示100?我不需要代码只是一些指导
谢谢!