缓冲区溢出无效。

8

我正在尝试在一个需要密码的简单程序上进行缓冲区溢出(我正在使用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上尝试了这个漏洞。发生了同样的事情。请问有人可以帮助我吗?谢谢。
4个回答

10
在现代Linux发行版中,会检测到缓冲区溢出并杀死该进程。要禁用此模式,只需使用以下标志(gcc)编译您的应用程序:

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


不错的帖子,伙计!你知道Cygwin环境下的解决方案吗?-fno-stack-protector似乎没有任何效果。 - Powerslave

3
如果使用gcc编译,请添加-fno-stack-protector 标志。你收到的消息旨在保护你的程序不受损坏的代码影响 :)

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

0

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

除此之外,操作系统还有保护机制,防止程序通过分配大量内存来严重消耗操作系统可用资源,从而导致系统崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接