C缓冲区溢出测试 - 当它不应该是64位的段故障?

时间:2015-01-27 18:29:15

标签: c gcc buffer

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

#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&#39; s密码让我成功登录。

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

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

所以为了尝试溢出,我做了16T作为密码。登录消息再次显示成功,但它也给出了分段错误。(它没有使用32位)。

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

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

2 个答案:

答案 0 :(得分:3)

您正在溢出缓冲区,但并非所有缓冲区溢出都以分段错误结束。这取决于你所写的内容,你的程序(或运行时库)之后的作用,各种因素。

答案 1 :(得分:3)

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

GoodPasswordpassword之间的地址差异为15(0x7fff1b452a8f - 0x7fff1b452a80),这意味着GoodPassword是第16个字符,您的堆栈框架中还有另一个字符使用空字节。

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