2013-01-03 34 views
5

我试图做一个缓冲区溢出(我使用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的一本名为“Hacking - The Art Of Exploitation”的书。在一章中,他解释了这种类型的漏洞利用(我从书中拿走了代码),并做了我所做的同样的命令。内存溢出,程序打印“访问授权”。现在,为什么我的操作系统正在检测我正在尝试利用该程序?我做错了什么?

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

回答

9

在现代linux发行版中检测到缓冲区溢出并且进程被终止。为了禁用该模式简单地编译这样的标志您的应用程序(GCC):

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

+0

好的,感谢您的回复,并帮助! – jndok

+0

不客气:) –

+0

好帖子,队友!你也许也知道Cygwin环境的解决方案吗? '-fno-stack-protector'似乎没有任何区别。 – Powerslave

0

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

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

3

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

1

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