zoukankan      html  css  js  c++  java
  • 栈溢出 利用虚函数

    环境

      win10  vs2017  Release   x86

    突破GS

      禁用DEP,ALSR,代码优化(要是不禁,溢出根本覆盖不到虚函数表)

      使用安全函数,不然会报错,要是禁用SDL,GS也会被禁掉。(反正我没搞定,不过好像也没啥影响,安全函数也阻止不了我写bug)

      1.虚函数的调用

        ①首先,虚函数的地址保存在虚函数表,虚函数表的地址保存在类对象前四个字节。

        vs中调试,监视对象,很明显。

        ②进入汇编层面,用od调试:

          调用gsv函数前,有两个参数,一是shellcode地址,一是this指针

     

        进入gsv函数:

        很明显,虚函数表保存在ebp+0xc,容器起始地址在ebp-0xd0+4,而复制了250字节(注:0xd0 = 208,后面还有三个push)

        虚函数表就被覆盖了。

       

         由于虚表被覆盖,再取虚函数地址时就出错了

      

       2.总结

        数组在ebp-0xCC,覆盖位置在 ebp+c,在数组第216个字节被覆盖。

      3.构建POC

        先来简单点的,栈地址恒定的。

        在被覆盖位置填上指定地址,指定地址里面填入pop pop retn的地址,shellcode最前面四个字节是jmp esp 地址。

        shellcode弹框的部分我是抄的书上的,难的是确定栈内数据位置。(其实也不难,可能我菜吧)

             

     应对ASLR(Address Space Layout Randomization)

      还是之前那些代码,在编译器中开启DynamicBase(随机基址,就是ASLR)

        随机基址原理:程序加载的时候,加载到随机基址,但也是0x10000的倍数,由于数据在段中的偏移是一定的,所以后两个字节是不变的,见图:

      (不要在意我把项目名取错了。。。)

      前置知识:

      类对象是存在.rdata段中,全局变量存在.data中,从图上可以看出,他们俩是多近,只要改后两个字节就能跳过去。

      shellcode弹框部分的地址0x13e3018

      

        类对象地址(this指针) 0x13e2110

        所以只要把虚表指针的后2个字节改为0x3018就能跳到encodeMessage数组里面去:

        因为之前用的strcpy,字符串末尾肯定有个0x00,只能在函数里面强行加0x30了。本来想用memcpy_s,好像被检测到了错误,直接就没编译,很无奈,

    当然了,如果把SDL关了就可以了。

        另外:数组长度计算是包含终止符'0x00'的。jmp esp的地址也可以换成shellcode内的地址,反正都是跳。(再说一次,把优化禁用了)

        补充:可以覆盖为0x13e3100,把shellcode弄长一点,就可以规避最后的'0x00'了

      

  • 相关阅读:
    Java 面向对象(七)多态
    Java 面向对象(六)接口
    Java 面向对象(五)抽象
    JavaScript 之 String 对象
    JavaScript 之 基本包装类型
    JavaScript 之 Array 对象
    【LeetCode-数组】三数之和
    【LeetCode-数组】加一
    【LeetCode-数组】搜索插入位置
    【LeetCode-数组】删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/jf-blog/p/12381200.html
Copyright © 2011-2022 走看看