2013-01-03 57 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個字節)。