探究劫持攻击C++虚函数(超简单)

admin 2021年12月22日20:35:32评论162 views字数 870阅读2分54秒阅读模式

探究劫持攻击C++虚函数(超简单)

扫一扫关注公众号,长期致力于安全研究探究劫持攻击C++虚函数(超简单)

前言:本文通过简易的代码,更通俗的理解C++虚函数的攻击



0x01 内存结构

首先可以看一下C++虚函数的结构图,劫持的方法可以通过修改虚表指针或虚函数指针来进行攻击。

探究劫持攻击C++虚函数(超简单)



0x02 代码
    下方是一个比较简单且常见的代码,speak则是由基类定义的虚函数,通过继承从而实现了多态。比较简单,这里不做过多详解
class animal{public:  virtual void speak(){    cout << "说话" << endl;  }  int age;};class cat :public animal{public:  virtual void speak(){    cout << "喵喵" << endl;    age = 0;  }  };class dog :public animal{public:  virtual void speak(){    cout << "汪汪" << endl;    age = 0;  }
};void fun(){ cout << "虚函数劫持成功" << endl;}int _tmain(int argc, _TCHAR* argv[]){ int *p = (int*)&fun;
fun(); animal* a1 = new cat(); a1->speak();
animal* a3 = new cat(); a3->speak(); animal* a2 = new dog(); a2->speak(); return 0;}
    接下来看一下内存结构,通过vfptr定位到了vtable,而vtable里面存的就是函数的地址

探究劫持攻击C++虚函数(超简单)



0x03 攻击思路

如果改写掉vtable里面的函数地址,是不是就达到攻击的目的?

首先获取fun函数的地址为0xd04e50

探究劫持攻击C++虚函数(超简单)

当类初始化完成之后,可以看到虚表的内容

探究劫持攻击C++虚函数(超简单)

而d014b5指向的就是cat类中的虚函数,如果将此地址改为fun函数(0xd04e50)之后呢

可以看到成功劫持虚函数

探究劫持攻击C++虚函数(超简单)


0x04 结尾

本文没有通过溢出的例子作为讲解,利用了最简单的方法,讲解了原理


11111
微信搜索关注 "安全族" 长期致力于安全研究


下方扫一下扫,即可关注探究劫持攻击C++虚函数(超简单)

探究劫持攻击C++虚函数(超简单)






本文始发于微信公众号(安全族):探究劫持攻击C++虚函数(超简单)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月22日20:35:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   探究劫持攻击C++虚函数(超简单)http://cn-sec.com/archives/468120.html

发表评论

匿名网友 填写信息