gpt4 book ai didi

C 缓冲区溢出测试 - 64 位上不应该出现段错误?

转载 作者:行者123 更新时间:2023-11-30 19:56:26 25 4
gpt4 key购买 nike

我有以下代码用于测试缓冲区溢出:

#include <stdio.h>
#include <string.h>

int PasswordOkay() {
char GoodPassword = 'F';
printf("The memory address of GoodPassword is: %p\n", (void*) &GoodPassword);
char Password[8];
printf("The memory address of password is: %p\n", (void*) &Password);
gets(Password);

if(!strcmp(Password, "SPOCKSUX"))
GoodPassword = 'T';
return (GoodPassword == 'T');
}

int main() {
puts("Enter Password:");
if(PasswordOkay())
puts("Hello, Dr. Bones");
else
puts("Access denied.");
}

在 32 位上,溢出工作正常,9T 的密码可以让我成功登录。

在 64 位上,我有这些内存地址:

The memory address of GoodPassword is: 0x7fff1b452a8f
The memory address of password is: 0x7fff1b452a80

为了尝试那里的溢出,我使用了 16T 作为密码。登录消息再次显示成功,但也出现了段错误。(32 位则没有)。

我的问题是:为什么在 64 位上会出现段错误?不应该是吗?因为我只是覆盖 GoodPassword。

附加说明:文件是用 gcc 编译的,尝试打开和关闭优化器。

最佳答案

您输入了 16 个字符 (TTTTTTTTTTTTTTTT),但您还必须将字符串的终止空字符视为第 17 个字符,这意味着在 GoodPassword 之后还有另一个字节在堆栈帧中被覆盖。

GoodPasswordpassword 之间的地址差异为 15 (0x7fff1b452a8f - 0x7fff1b452a80),这意味着 GoodPassword 是第 16 个字符,并且堆栈帧中还有另一个与空字节相差一的字符。

如果紧随其后的字节(堆栈的上部GoodPassword)是帧指针地址或保存的堆栈指针地址(甚至是安全金丝雀值!)的一部分,则可能会出现段错误。

关于C 缓冲区溢出测试 - 64 位上不应该出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28177494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com