一种针对虚函数表劫持攻击的防御方法

文档序号:8905419阅读:474来源:国知局
一种针对虚函数表劫持攻击的防御方法
【技术领域】
[0001]本发明属于应用程序技术领域,尤其涉及一种针对虚函数表劫持攻击的防御方法。
【背景技术】
[0002]内存破坏漏洞(memory corrupt1n bugs)广泛存在于使用C/C++等低级语言编写的程序中,栈溢出、堆溢出、释放后重用等漏洞均属于内存破坏漏洞。攻击者利用此类漏洞,可以控制应用程序内存中的数据、代码,改变程序行为甚至劫持程序的控制流。
[0003]现有技术中有以下两种处理方式:
[0004]VTGuard:VTGuard是部署在IE浏览器中的一项虚函数表保护技术。其基本思想是:在每个虚函数表中插入一个私密的cookie,并在虚函数被调用时进行检查,当前表中的cookie和对应的cookie是否一致,如果不一致则会禁止此次调用。该方案能够有效减少虚函数表重用攻击,但对虚函数表破坏和虚函数表注入攻击无效。
[0005]SafeDispatch:SafeDispatch是基于编译器的虚函数表劫持攻击防御方案,它首先对整个程序的类关系进行分析,推断出程序中有效的虚函数表集合及虚函数集合;接着在虚函数被调用时进行安全校验,检查当前虚函数及虚函数表是否在有效集合中,若不在则禁止此次调用。对于虚函数的检查,将带来7%的额外开销;对于虚函数表的检查,将带来30%的额外开销,且对虚函数表破坏攻击无效。
[0006]DieHard:DieHard提供了自定义的内存分配器,在进行内存分配时实现随机化及隔离。该技术方案在某种程度上对虚函数表劫持攻击有效,但存在不确定性。
[0007]但是上述方案中,均存在以下缺陷:有效性:VTGuard、SafeDispatch、DIeHard均无法保证对所有类型的虚函数表劫持攻击进行有效防护;二进制兼容:VTGuard、SafeDispatch以及DieHard均不二进制兼容,即需要源代码。而在实际中获取目标保护程序的源码是极其困难的;系统开销-SafeDispatch所带来的系统开销7与% 30)使其很难应用于实际中。

【发明内容】

[0008]为解决上述问题,本发明提供一种针对虚函数表劫持攻击的防御方法。本发明基于二进制重写技术,不需要源码即可完成部署;且能够有效防护程序中的重要对象,不受虚函数表劫持攻击的影响;而本发明所带来的系统开销也在可接受范围之内。
[0009]本发明的针对虚函数表劫持攻击的防御方法,其包括:
[0010]步骤一、构建有效虚函数表集合和有效虚函数集合;有效虚函数表集合用于存储虚函数表指针,虚函数表指针指向虚函数表;有效虚函数集合用于存储虚函数表,虚函数表用于存储虚函数指针,虚函数指针指向虚函数;
[0011 ] 步骤二、确定可执行程序中可能被虚函数表劫持攻击、需要被保护的对象和对象中的虚函数,分析得到虚函数数据的读取地址和虚函数的调用地址;其中,虚函数数据包括:虚函数表指针和虚函数表;同一个对象的不同虚函数数据采用相同读取地址,且虚函数数据中的虚函数表指针和虚函数表采用相同读取地址;
[0012]步骤三、在可执行程序的运行过程中,采用动态二进制插装方式,在虚函数数据的读取地址处插装备份回调函数,在虚函数的调用地址处插装校验回调函数;
[0013]步骤四、当可执行程序执行到某个对象X的虚函数数据对应的备份回调函数时,在该备份回调函数中,将对象X的虚函数表指针及其指向的虚函数表进行备份,其中虚函数表指针备份到有效虚函数表集合中,虚函数表备份到有效虚函数集合中;
[0014]步骤五、当可执行程序执行到某个虚函数对应的校验回调函数时,在校验回调函数中,检查被调用的虚函数所在的虚函数表的虚函数表指针Y是否在有效虚函数表集合中;
[0015]若虚函数表指针Y不在有效虚函数表集合中,则校验失败、拒绝调用虚函数,并立即终止该可执行程序;
[0016]若虚函数表指针Y在有效虚函数表集合中,则根据备份的有效虚函数表集合和有效虚函数集合,找到虚函数表指针Y指向的虚函数表Z;判断被调用的虚函数指针是否在虚函数表Z中,若在则校验成功,运行可执行程序调用虚函数,否则校验失败、拒绝调用虚函数,并终止该可执行程序。
[0017]进一步的,步骤四中备份后将备份数据所在的内存页的访问属性修改为只读。
[0018]有益效果:
[0019]本发明通过二进制插装技术,在对象实例化时插装代码对虚函数表指针及虚函数表进行备份;在对象的虚函数被调用时,依据当前虚函数表指针和虚函数指针与原有值进行比对以判断是否能够进行调用。通过这种方式,本发明在二进制层面对虚函数表进行了防护,有效保护对象不受虚函数表劫持攻击的影响。
【附图说明】
[0020]图1(a)为本发明的针对虚函数表劫持攻击的防御方法示意图;
[0021]图1(b)为本发明的备份数据示意图;
[0022]图1 (c)为本发明的校验过程流程图;
[0023]图2为可执行程序调用虚函数的代码示意图;
[0024]图3 (a)为本发明的实施例中对象d的类结构;
[0025]图3(b)为本发明的实施例中对象d的虚函数表内存布局。
【具体实施方式】
[0026]PE文件中有多个对象,其中部分对象的虚函数表易受到攻击者的攻击,夺取程序的控制流,执行危险代码,影响系统安全。
[0027]本发明技术方案如图1 (a)所示。首先,对待保护的PE文件进行预分析,得到需要保护对象的虚函数表的生成处及虚函数的调用处;接下来,在生成处及虚函数调用处进行插装,添加对目标程序的防护。为了对目标程序进行插装,需要通过预分析得到:1.虚函数表生成位置,以便进行插装进行数据备份;2.虚函数调用位置,以便进行插装在调用时做安全验证。目前有多种针对二进制文件的分析方法可以实现这个目标,包括自动分析平台、静态分析、动态分析等。
[0028]本发明的针对虚函数表劫持攻击的防御方法,其包括:
[0029]步骤一、构建有效虚函数表集合和有效虚函数集合;有效虚函数表集合用于存储虚函数表指针,虚函数表指针指向虚函数表;有效虚函数集合用于存储虚函数表,虚函数表用于存储虚函数指针,虚函数指针指向虚函数。
[0030]步骤二、确定可执行程序中可能被虚函数表劫持攻击、需要被保护的对象和对象中的虚函数,分析得到虚函数数据的读取地址和虚函数的调用地址;其中,虚函数数据包括:虚函数表指针和虚函数表;同一个对象的不同虚函数数据采用相同读取地址,且虚函数数据中的虚函数表指针和虚函数表采用相同读取地址;
[0031]其中获得虚函数调用地址的方式为:
[0032]通过网络获得攻击代码,修改攻击代码对虚函数指针或虚函数表指针的赋值语句,在可执行程序调用虚函数且该虚函数在被修改后的攻击代码攻击时,可执行程序报错,则可执行程序报错时可执行程序所执行的指令地址即为虚函数的调用位置。
[0033]获得虚函数数据的读取地址的方式为:
[0034]在可执行程序中分析虚函数调用时的代码,追踪该虚函数所属对象的数据流以确定对象的虚函数数据的读取位置。
[0035]步骤三、在可执行程序的运行过程中,采用动态二进制插装方式,在虚函数数据的读取地址处插装备份回调函数,在虚函数的调用地址处插装校验回调函数。
[0036]步骤四、当可执行程序执行到某个对象X的虚函数数据对应的备份回调函数时,在该备份回调函数中,将对象X的虚函数表指针及其指向的虚函数表进行备份,其中虚函数表指针备份到有效虚函数表集合中,虚函数表备份到有效虚函数集合中。
[0037]步骤五、当可执行程序执行到某个虚函数对应的校验回调函数时,在校验回调函数中,检查被调用的虚函数所在的虚函数表的虚函数表指针Y是否在有效虚函数表集合中;
[0038]若虚函数表指针Y不在有效虚函数表集合中,则校验失败、拒绝调用虚函数,并立即终止该可执行程序;
[0039]若虚函数表指针Y在有效虚函数表集合中,则根据备份的有效虚函数表集合和有效虚函数集合,找到虚函数表指针Y指向的虚函数表Z;判断被调用的虚函数指针是否在虚函数表Z中,若在则校验成功,运行可执行程序调用虚函数,否则校验失败、拒绝调用虚函数,并终止该可执行程序。
[0040]进一步的,步骤四中备份后将备份数据所在的内存页的访问属性修改
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1