【发布时间】: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