简介

这几天在twitter上无意间发现了一个讲类型混淆的paper,遂决定分析一下Windows内核中类型混淆的漏洞模式,本文也是基于两篇paper进行分析学习,首先介绍C++中类型混淆的原理,然后介绍一个Direct X模块的漏洞 。读完本文你会发现实际上后面这个内核洞和前面介绍的C++类型混淆关系不大,是的,我也这么觉得。这么做的原因是前面这部分适合拿来学习原理,原理介绍清楚了之后,后面就靠积累和发散了,实际上你会发现还是有很多相似点的,参考文章链接在文末

C++强制类型转换

C++强制类型转换有很多种,这里简单介绍一下static_castdynamic_cast,在C语言中强制类型转换模型如下

// C
double scores = 95.5;
int n = (int)scores;

C++中强制类型转换使用方法如下,单从文字上看,static_castdynamic_cast区别主要是动态和静态,这使我联想到了动态链接和静态链接,虽然没什么关系

class B
{
public:
    int m_iNum;
    virtual void foo();
};

class D:public B
{
public:
    char* m_szName[100];
};

void func(B* pb)
{
    D* pd1 = static_cast<D*>(pb);
    D* pd2 = dynamic_cast<D*>(pb);
}

从汇编层面看的话,Debug版本静态转换并没有做过多的事情,只是单纯的保存了一下指针,只在编译时检查数据类型,没有在运行时进行检查,不过优点就是速度快,效率高

然而动态转换会运行时对指针进行检查,检查是否为空,检查类型是否正确等,但这也降低了效率,而且仅限于多态类,类似于CFG之类的防护机制

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖