【问题标题】:Experimental buffer overflow in Ubuntu 10 (assembly)Ubuntu 10(程序集)中的实验缓冲区溢出
【发布时间】:2012-08-31 12:56:52
【问题描述】:

我正在尝试使用 C 程序溢出 Ubuntu 10.04 中的缓冲区并将返回地址转移到函数“垃圾”。但我无法用未使用的函数“垃圾”的地址覆盖返回地址。它只是在 12 个字节的堆栈上转储一些未知地址。请帮我解决它。这是C代码:-

    (gdb) list 
    1   #include<stdio.h>
    2   void display()
    3   {
    4       char buff[8];
    5       gets(buff);
    6       puts(buff);
    7   }
    8   main()
    9   {
    10      display();
    (gdb) 
    11      return(0);
    12  }
    13  junk()
    14  {
    15      printf("cracked");
    16  }

main 的反汇编代码是:- 函数 main 的汇编代码转储:

    0x08048462 <+0>:    push   %ebp
    0x08048463 <+1>:    mov    %esp,%ebp
    0x08048465 <+3>:    call   0x8048444 <display>
    0x0804846a <+8>:    mov    $0x0,%eax
    0x0804846f <+13>:   pop    %ebp
    0x08048470 <+14>:   ret    

汇编程序转储结束。

函数显示的汇编代码转储:

    0x08048444 <+0>:    push   %ebp
    0x08048445 <+1>:    mov    %esp,%ebp
    0x08048447 <+3>:    sub    $0xc,%esp
    0x0804844a <+6>:    lea    -0x8(%ebp),%eax
    0x0804844d <+9>:    mov    %eax,(%esp)
    0x08048450 <+12>:   call   0x8048350 <gets@plt>
    0x08048455 <+17>:   lea    -0x8(%ebp),%eax
    0x08048458 <+20>:   mov    %eax,(%esp)
    0x0804845b <+23>:   call   0x8048380 <puts@plt>
    0x08048460 <+28>:   leave  
    0x08048461 <+29>:   ret    

汇编程序转储结束。

函数垃圾的汇编代码转储:

    0x08048471 <+0>:    push   %ebp
    0x08048472 <+1>:    mov    %esp,%ebp
    0x08048474 <+3>:    sub    $0x4,%esp
    0x08048477 <+6>:    mov    $0x8048550,%eax
    0x0804847c <+11>:   mov    %eax,(%esp)
    0x0804847f <+14>:   call   0x8048370 <printf@plt>
    0x08048484 <+19>:   leave  
    0x08048485 <+20>:   ret    

汇编程序转储结束。

现在我在没有堆栈保护的情况下组装它:-

    gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c

如果我输入以下内容:- printf "wwwwwwwwwwww\x72\x84\x04\x08" | ./缓冲区

值:- "x72\x84\x04\x08" 作为未使用函数 "junk" 的第一条指令的转移地址。 它在 12 个字节上存储了一些奇怪的内存值以及返回地址,但不是我的地址。并再次给出“分段错误”。有没有其他方法可以在较新的 Linux 版本中利用缓冲区?

【问题讨论】:

    标签: c linux stack-overflow


    【解决方案1】:

    leave 等价于:

    movl %ebp, %esp
    popl %ebp
    

    因此,在您的情况下,如果您为 %ebp 提供“wwww”,程序将尝试执行以下操作:

    movl $0x77777777, %esp    ; 0x77777777 = 'wwww'
    popl %ebp                 ; read from address 0x77777777!
    

    您需要为 %esp 提供一个合理的值!

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 2013-02-01
      • 2011-12-19
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多