zoukankan      html  css  js  c++  java
  • 缓冲区溢出实验 6 exit(0)

    实验环境、代码、及准备

     https://www.cnblogs.com/lqerio/p/12870834.html

    vul6

    Vul6和vul2类似,可以覆盖foo的ebp的一字节。而这里有一个exit(0),需要绕过。绕过思路见3.6exploit6

     

    shellcode(构造过程)

    原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

    下面的shellcode长度为45字节(不含/0)

     

    /*

     * Aleph One shellcode.

     */

    static const char shellcode[] =

      "xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b"

      "x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd"

      "x80xe8xdcxffxffxff/bin/sh";

    exploit6

     

    由1.6vul6可知,除了覆盖ebp外,还需要绕过exit(0)。

     

    Gdb /tmp/vul6

    Set args 123131

    B foo

    C

    B bar

     

    可知ebp和buf分别的值。其中buf范围为0xbffffd70-fe38,如果修改ebp最后为00,0xbffffe00在buf当中

    而已知p指针在ebp+4,a在ebp+8.

    继续调试

    Disas foo,可见 0x804858b,调用0x8048980的exit

    Disas  0x8048380。

    可见exit先是jmp到0x804a00c。

    所以绕过的思路为:修改p,指向0x804a00c,然后修改0x804a00c的内容为shellcode地址。而shellcode地址其实就是buf地址(payload已经copy了)。

     

    上面已知buf地址 0xbffffd70,ebp0xbffffe38,由vul2可知ebp修改为0xbfffef00后,p和a相对于ebp的位置不变。于是修改ebp-[0-3]就相当于修改p,ebp-[4-7]的位置就修改了a的值。

    然后程序foo正常执行,exit->0x804a00c->a->shellcode。

     

    这里ebp修改后距离buf 144字节,p的位置为相对140-143字节,a为139-136字节

     

    注意和vul2的区别在于p,a相对ebp的位置是在低地址

    Payload:

    这里发现刚刚调试的时候用的payload是”hi there”,改为201字节的payload后有所更改

    修改相应地址即可

     

  • 相关阅读:
    现在分词做状语,到,非谓语动词
    成功和失败因素收集
    退拽原理2
    分享到(事件冒泡实例)
    滚动公告(纵向)
    RabbitMQ消息队列(一): Detailed Introduction 详细介绍
    在IDEA中实战Git
    深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
    MySQL中日期和时间戳互相转换的函数和方法
    【Docker】 windows10 docker 使用
  • 原文地址:https://www.cnblogs.com/lqerio/p/12870988.html
Copyright © 2011-2022 走看看