2014-05-24 32 views
0

嗯,我嘗試玩堆棧溢出和安全cookie, 但它看起來大多數教程程序,與POC教程與他們的人都沒有安全cookie編譯。寫入文件讀取代碼溢出

因此,我決定創建一個程序,從文件中獲取輸入並創建緩衝區溢出。 這是我拿出:

#include <stdio.h> 
#include <string.h> 

void manipulate(char *buffer) 
{ 
    char newbuffer[80]; 
    strcpy(newbuffer, buffer); 
} 

int main() 
{ 
    char ch, buffer[4096]; 
    char filename[] = "exploit.txt"; 
    int i = 0; 
    FILE *inFile; 

    inFile = fopen(filename, "rb"); 
    if (inFile == NULL) 
    { 
     fprintf(stderr, "Can't open input file !\n"); 
     getchar(); 
     return 1 ; 
    } 
    while (buffer[i] != EOF) 
    { 
     buffer[i++] = fgetc(inFile); 
     manipulate(buffer); 
     printf("The value of i is : %d\n", i); 
     getchar(); 
     return 0; 
    } 

} 

我的問題是,我總是得到Can't open input file !\n。即使我在同一位置創建了「exploit.txt」,並在其中添加了一些「aaaa」。

+0

使用絕對文件或使用API​​來接收其路徑和發佈結果。順便說一句,c sharp不是研究緩衝區溢出的最佳語言。堅持c。 – icbytes

+1

「...在同一位置......」與** **相同​​的位置??例如:如果不更改項目配置,則從調試器運行的VC++程序的默認工作目錄是** project **文件夾(即.vcprojx文件所在的位置)。把你的輸入文件放在那裏(假設這是在msdev下運行)。 – WhozCraig

+0

我把它放在項目文件夾裏面調試。 –

回答

1

打開文件的基礎知識是正確的。通過使用errnostrerror來通知用戶爲什麼嘗試打開文件失敗,可以改進您的程序。

#include <errno.h> 
fprintf(stderr, "Error opening \"%s\": %s\n", filename, strerror(errno)); 

我能夠成功運行您的示例程序(忽略堆棧溢出部分)而沒有任何更改。

問題出在當前或當前工作目錄的值上,該目錄被用作打開任何文件的完成文件路徑的基礎。

您可以使用getcwd()<unixstd.h>爲Linux,BSD和POSIX系統或_getcwd()<direct.h>檢查程序的工作目錄其他類型。

Nitpicking:與fopen以二進制模式打開相比,「txt」文件擴展名具有誤導性,具體由rb指定。