我已经购买了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;但显然仍然有同样的错误。)
这是为什么?苹果公司的内存管理是否也被这种简单的事情所欺骗?非常感谢帮助!如果您了解其他可以解释黑客攻击方式的好网站,请随时引用它们!
答案 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.