7

我试图在一个需要密码的简单程序上进行缓冲区溢出(我使用的是 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;

}

OK,现在我编译好了,没有错误,保存为overflow.c。

现在我打开终端,进入文件目录(桌面),然后写道:

./overflow.c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

终端说:“检测到堆栈粉碎”(或类似的东西)然后退出程序执行。

现在,我正在阅读 Jon Erickson 的一本书,名为“Hacking - The Art Of Exploitation”。在一个章节中,他解释了这种类型的利用(我从书中获取了代码)并执行了与我相同的命令。内存溢出,程序打印“Access grant.”。现在,为什么我的操作系统检测到我正在尝试利用该程序?我做错了什么?

我还在 Mac OS X 上尝试了该漏洞利用。同样的事情也发生了。请问,有人可以帮我吗?提前致谢。

4

4 回答 4

10

在现代 linux 发行版中,检测到缓冲区溢出并终止进程。为了禁用该模式,只需使用此类标志 (gcc) 编译您的应用程序:

-fno-stack-protector -fno-stack-protector-all

于 2013-01-03T17:43:45.850 回答
3

如果使用 gcc 编译,请添加-fno-stack-protector标志。您收到的消息旨在保护您免受错误代码的影响:)

于 2013-01-03T17:45:30.007 回答
1

原因是堆栈粉碎实际上是一些编译器用来检测缓冲区溢出攻击的保护机制。您正试图将 29 个 A 放入一个较短的字符数组(16 个字节)中。

于 2013-01-03T17:46:48.500 回答
0

大多数现代操作系统都内置了保护机制。几乎所有好的操作系统都不允许直接访问任何程序的低级内存。它只允许程序访问分配给它们的地址空间。基于 Linux 的操作系统会自动终止尝试访问超出其分配的内存空间的进程。

除此之外,操作系统还具有保护机制,通过分配大量内存来防止程序崩溃,以试图严重耗尽操作系统可用的资源。

于 2013-01-03T17:44:54.997 回答