我试图在一个需要密码的简单程序上进行缓冲区溢出(我正在使用Linux)。这是程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password){
int auth_flag = 0;
char password_buffer[16];
strcpy(password_buffer, password);
if(strcmp(password_buffer, "pass1") == 0)
auth_flag = 1;
if(strcmp(password_buffer, "pass2") == 0)
auth_flag = 1;
return auth_flag;
}
int main(int argc, char **argv)
{
if(argc < 2){
printf("\t[!] Correct usage: %s <password>\n", argv[0]);
exit(0);
}
if(check_authentication(argv[1])){
printf("\n-=-=-=-=-=-=-=-=\n");
printf(" Access granted.\n");
printf("-=-=-=-=-=-=-=-=\n");
} else {
printf("\nAccess Denied.\n");
}
return 0;
}
好的,现在我编译了它,没有错误,并将其保存为overflow.c。
现在我打开终端,我移动到文件目录(桌面),然后写道:
./overflow.c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
终端说:“堆栈粉碎检测到”(或类似的东西),然后退出程序执行。
现在,我正在读一本名为“黑客 - 剥削艺术”的书,由Jon Erickson撰写。在一章中,他解释了这种类型的漏洞利用(我从书中获取了代码)并执行了我所做的相同命令。内存溢出,程序打印“已授予访问权限”。现在,为什么我的操作系统检测到我正在尝试利用该程序?我做错了什么?
我也在Mac OS X上试过了这个漏洞。同样的事情发生了。拜托,有人可以帮帮我吗?提前谢谢。
答案 0 :(得分:9)
在现代Linux发行版中,检测到缓冲区溢出并且该进程被终止。要禁用该模式,只需使用此类标志(gcc)编译应用程序:
-fno-stack-protector -fno-stack-protector-all
答案 1 :(得分:3)
如果使用gcc进行编译,请添加-fno-stack-protector
标志。您收到的信息旨在保护您免受恶意代码的影响:)
答案 2 :(得分:1)
原因是堆栈粉碎实际上是一些编译器用来检测缓冲区溢出攻击的保护机制。您正在尝试将29 A放入较短的字符数组(16个字节)。
答案 3 :(得分:0)
大多数现代操作系统都内置了保护机制。几乎任何好的操作系统都不允许直接对任何程序进行低级别内存访问。它只允许程序访问分配给它们的地址空间。基于Linux的操作系统会自动终止尝试访问超出其分配的内存空间的进程。
除此之外,OS还具有保护机制,通过分配大量内存来防止程序崩溃,从而严重耗尽OS可用的资源。