缓冲区溢出不适用于 Mac OSX El Capitan

Buffer Overflow does not work on Mac OSX El Capitan

我买了 Jon Erickson 的书 "Hacking - The Art of Exploitation",他在书中描述了一个缓冲区溢出的简单示例,如下所示:

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 个“A”,因此对于 password_buffer 而言太多了)来调用缓冲区溢出,从而使程序出现异常并打印 Access Granted.,程序刚刚退出,OSX El Capitan 告诉我我有一个 segmentation fault。 (顺便说一句。我也尝试了更多的“A”,但显然仍然有同样的错误。)

这是为什么? Apple 的内存管理是否已经进化到不能被这样简单的事情所欺骗?帮助将不胜感激!如果您知道其他介绍如何学习黑客技术的好网站,请随时参考!

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

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

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

这样终于成功了,我得到了:

./a.out AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Access Granted.