【问题标题】:Buffer Overflow does not work on Mac OSX El Capitan缓冲区溢出在 Mac OSX El Capitan 上不起作用
【发布时间】:2015-12-13 01:34:55
【问题描述】:

我买了 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 的内存管理是否过于进化而不会被这样简单的事情所欺骗?帮助将不胜感激!如果您知道其他解释如何学习黑客的好网站,请随时参考!

【问题讨论】:

  • 操作系统可能采用了一些更高级的buffer overflow protection 技术
  • 坐下来想想未定义行为的影响。
  • 你知道关闭它的方法吗?我浏览了这篇文章并尝试了gcc -fno-stack-protector之类的东西,但现在程序直接中止了
  • @Olaf 哈哈我很乐意!但光想它似乎还不够,我想看到它发生!
  • 您的编译器可能正在优化 auth_flag,因为您只是从中返回 0 或 1。这样只会在密码缓冲区之后留下返回地址,并且会出现段错误。

标签: c macos osx-elcapitan buffer-overflow


【解决方案1】:

我刚刚找到了解决方案! (耶\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.

【讨论】:

    猜你喜欢
    • 2016-03-03
    • 2012-12-18
    • 2016-01-25
    • 1970-01-01
    • 2016-11-03
    • 2016-04-08
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多