栈溢出 利用虚函数

Posted jf-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈溢出 利用虚函数相关的知识,希望对你有一定的参考价值。

环境

  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弹框的部分我是抄的书上的,难的是确定栈内数据位置。(其实也不难,可能我菜吧)

         技术图片

 

 

    

    

  

 

以上是关于栈溢出 利用虚函数的主要内容,如果未能解决你的问题,请参考以下文章

利用虚函数实现多态的方式:动态绑定

《coredump问题原理探究》Windows版 笔记

windows 7中内存保护机制不包括哪项技术?

通过基类的指针或引用调用虚函数构成多态

通过基类的指针或引用调用虚函数构成多态

C++编程练习:多态实验——利用抽象类和纯虚函数,编程计算正方体球体和圆柱体的表面积和体积。