缓冲区溢出在Mac OSX El Capitan上不起作用

时间:2015-12-13 01:34:55

标签: c macos osx-elcapitan buffer-overflow

我已经购买了Jon Erickson的书"黑客 - 剥削的艺术"在其中,他描述了一个缓冲区溢出的简单示例:

int check_authentication(char *password) {
    int auth_flag = 0;
    char password_buffer[16];

    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "password") == 0)
        auth_flag = 1;

    return auth_flag
}

int main(int argc, char* argv[]) {
    if(argc < 2) {
        printf("Usage: %s <password>\n", argv[0]);
    }

    if(check_authentication(argv[1])) {
        printf("Access Granted.\n");
    } else {
        printf("Access Denied.\n");
    }
}

在开始编译后,我使用./a.out password进行了测试,这显然有效,然后使用./a.out testtest,这也可以按预期工作。但是,如果我想通过输入./a.out AAAAAAAAAAAAAAAAA来调用缓冲区溢出(正好是17&#39; A,那么password_buffer太多了)会导致程序行为异常,打印Access Granted.,程序退出,OSX El Capitan告诉我,我有segmentation fault。 (顺便说一下,我还试过更多的A&#39;但显然仍然有同样的错误。)

这是为什么?苹果公司的内存管理是否也被这种简单的事情所欺骗?非常感谢帮助!如果您了解其他可以解释黑客攻击方式的好网站,请随时引用它们!

1 个答案:

答案 0 :(得分:4)

我刚刚找到解决方案! (yay \ o /)

起初我尝试通过以下方式进行编译:
gcc -fno-stack-protector auth_overflow.c

然而这并没有多大帮助。我还必须将-D_FORTIFY_SOURCE=0 - 标志设置为零,如下所示: gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 auth_overflow.c

这种方式终于奏效了,我得到了:

./a.out AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Access Granted.