首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu 10 (汇编)中的实验性缓冲区溢出

Ubuntu 10 (汇编)中的实验性缓冲区溢出
EN

Stack Overflow用户
提问于 2012-09-07 00:40:07
回答 1查看 279关注 0票数 2

我试图在Ubuntu 10.04中使用C程序溢出缓冲区,并将返回地址转移到函数"junk“。但是我不能用未使用的函数“垃圾”的地址覆盖返回地址。它只是在12个字节的堆栈上转储一些未知的地址。请帮我排查一下。下面是C代码:

代码语言:javascript
复制
    (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函数的汇编代码转储:

代码语言:javascript
复制
    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    

汇编程序转储结束。

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

代码语言:javascript
复制
    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    

汇编程序转储结束。

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

代码语言:javascript
复制
    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    

汇编程序转储结束。

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

代码语言:javascript
复制
    gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c

如果输入:- printf "wwwwwwwwwwww\x72\x84\x04\x08“| ./buffer

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

EN

回答 1

Stack Overflow用户

发布于 2012-09-15 04:31:36

leave相当于以下内容:

代码语言:javascript
复制
movl %ebp, %esp
popl %ebp

因此,在您的示例中,如果您为%ebp提供'wwww‘,程序将尝试执行以下操作:

代码语言:javascript
复制
movl $0x77777777, %esp    ; 0x77777777 = 'wwww'
popl %ebp                 ; read from address 0x77777777!

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12304589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档