扫一扫关注公众号,长期致力于安全研究
前言:本文通过简易的代码,更通俗的理解C++虚函数的攻击
首先可以看一下C++虚函数的结构图,劫持的方法可以通过修改虚表指针或虚函数指针来进行攻击。
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;
}
如果改写掉vtable里面的函数地址,是不是就达到攻击的目的?
首先获取fun函数的地址为0xd04e50
当类初始化完成之后,可以看到虚表的内容
而d014b5指向的就是cat类中的虚函数,如果将此地址改为fun函数(0xd04e50)之后呢
可以看到成功劫持虚函数
本文没有通过溢出的例子作为讲解,利用了最简单的方法,讲解了原理
下方扫一下扫,即可关注
本文始发于微信公众号(安全族):探究劫持攻击C++虚函数(超简单)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论