基于虚函数表继承关系的代码重利用攻击检测方法

文档序号:10654467阅读:380来源:国知局
基于虚函数表继承关系的代码重利用攻击检测方法
【专利摘要】本发明公开一种基于虚函数表继承关系的代码重利用攻击检测方法,包括:预处理;虚函数调用点识别;虚函数表识别;虚函数表继承关系识别;防护检测。通过对可执行文件进行分析,根据其中虚函数表之间的继承关系,对代码中的虚函数调用点进行控制流完整性保护,检测代码重利用攻击,避免采用原有方法依赖源代码获得合法虚函数集合或将所有虚函数视为合法集合的检测策略,具有较高检测精度和速度,提高代码重利用攻击检测的准确性、通用性和效率。
【专利说明】
基于虚函数表继承关系的代码重利用攻击检测方法
技术领域
[0001]本发明属于代码重利用攻击检测方法的技术领域,尤其涉及一种基于虚函数表继承关系的代码重利用攻击检测方法。
【背景技术】
[0002]C++语言支持动态绑定,代码中存在大量的由虚函数调用而产生的间接跳转,极易为攻击者所利用,并且代码重用攻击不需要注入攻击代码,具有较好的隐蔽性、和图灵完备的计算能力,给用户计算机系统安全带来极大危害。针对虚函数调用点的控制流进行完整性保护,是检测代码重利用攻击的重要手段之一。然而,目前的代码重利用攻击检测方法在检测过程中存在着应用范围有限、不够准确、时间开销大等缺点,影响着检测方法的适用性。

【发明内容】

[0003]针对目前代码重利用攻击检测方法在检测过程中存在着通用性差、准确性低、性能开销大的问题,本发明提出一种基于虚函数表继承关系的代码重利用攻击检测方法。
[0004]为了对披露的实施例的一些方面有一个基本的理解,下面给出了简单的概括。该概括部分不是泛泛评述,也不是要确定关键/重要组成元素或描绘这些实施例的保护范围。其唯一目的是用简单的形式呈现一些概念,以此作为后面的详细说明的序言。
[0005]本发明采用如下技术方案:
[0006]在一些可选的实施例中,提供一种基于虚函数表继承关系的代码重利用攻击检测方法,包括:
[0007]预处理:对可执行文件进行预处理,生成中间语言文件;
[0008]虚函数调用点识别:针对所述中间语言文件进行数据流分析,识别出所述中间语言文件中的虚函数调用点集合,作为运行时防护的检测点;
[0009]虚函数表识别:扫描所述可执行文件,检测所述可执行文件中的虚函数表集合并得到所有虚函数表中的虚函数;
[0010]虚函数表继承关系识别:结合所述中间语言文件和所述虚函数表集合,分析得出虚函数表之间的继承关系,作为运行时检测代码重利用攻击的依据;
[0011]防护检测:利用虚函数表继承关系对程序进行运行时防护,验证虚函数调用的合法性,检测代码重利用攻击。
[0012]在一些可选的实施例中,所述虚函数调用点是指程序中虚函数调用的指令,所述虚函数调用点的数据结构包括:指令所在的地址;所述虚函数表的数据结构包括:虚函数表所在的地址及虚函数表中的所有虚函数的地址组成的集合;虚函数表继承关系的数据结构为一个集合,所述集合的元素为关联虚函数表集合,所述关联虚函数表集合是指由虚函数表组成的集合,所述关联虚函数表集合中的所有虚函数表之间具有继承关系。
[0013]在一些可选的实施例中,所述预处理的过程包括:利用二进制程序行为监测分析平台,以所述可执行文件为输入,对所述可执行文件中的代码段进行反汇编转换为中间语言,并输出中间语言文件。
[0014]在一些可选的实施例中,所述虚函数调用点识别的过程包括:生成间接函数调用点集合;在所述间接函数调用点集合中依次取一个间接函数调用点;在取出的间接函数调用点处开始进行逆向数据流分析,得到函数调用目的地址表达式;将所述函数调用目的地址表达式与形式deref (deref (exp )+Tval)相比较;若比较结果为符合,对间接调用的第一个参数从传参的位置处开始进行逆向数据流分析,直到函数开头,得到参数在函数开头位置处的表达式;将所述参数在函数开头位置处的表达式与所述函数调用目的地址表达式中的exp进行比较;若比较结果为符合,将所述间接函数调用点加入虚函数调用点集合。
[0015]在一些可选的实施例中,所述虚函数表识别的过程包括:扫描所述可执行文件,找出出现的所有立即数并存在立即数链表中;从所述立即数链表中取一个立即数;以所述立即数为指针,判断所述立即数指向的区域是否为只读数据区;若所述立即数指向的区域为只读数据区,从所述立即数指向的地址取数据,以取到的数据为指针;若所述指针指向合法指令地址,读取虚函数表中的虚函数;将读取的虚函数表加入虚函数表集合。
[0016]在一些可选的实施例中,所述虚函数表继承关系识别的过程包括:在程序中依次取出一个函数;对取出的函数进行数据流分析,得到虚函数表指针初始化信息集合;从所述虚函数表指针初始化信息集合依次取一条虚函数表指针初始化信息;将取出的虚函数表指针初始化信息中的虚函数表集合插入虚函数表继承关系。
[0017]在一些可选的实施例中,所述将取出的虚函数表指针初始化信息中的虚函数表集合插入虚函数表继承关系的过程包括:若待插入的虚函数表集合与虚函数表继承关系中的某个虚函数表集合有交集,则将两个集合合并,否则,将待插入的虚函数表集合直接插入虚函数表继承关系中。
[0018]在一些可选的实施例中,所述防护检测的过程包括:
[0019]701:启动二进制插粧平台,载入应用程序的可执行文件;
[0020]702:从可执行文件依次取指令;
[0021]703:判断是否取到指令,若取到指令,进行步骤704,否则进行步骤715;
[0022]704:在所述虚函数调用点集合中查找取出的指令的地址;
[0023]705:判断是否查找到取出的指令的地址,若查找到,进行步骤706,否则,进行步骤714;
[0024]706:取虚函数调用点所绑定的关联虚函数表集合;
[0025]707:判断是否取到关联虚函数表集合,若取到,则进行步骤708,否则,进行步骤710;
[0026]708:在关联虚函数表集合中的虚函数表中查找目的地址;
[0027]709:判断是否查找到目的地址,若查找到目的地址,则进行步骤714,否则,进行步骤712;
[0028]710:根据目的地址查找关联虚函数表集合;
[0029]711:判断是否查找到关联虚函数表集合,若查找到关联虚函数表集合,则进行步骤713,否则进行步骤712;
[0030]712:进行报告,报告检测到了代码重利用攻击;
[0031]713:绑定虚函数调用点与关联虚函数集合;
[0032]714:执行指令;
[0033]715:结束,终止程序。
[0034]本发明所带来的有益效果:通过对可执行文件进行分析,根据其中虚函数表之间的继承关系,对代码中的虚函数调用点进行控制流完整性保护,检测代码重利用攻击,避免采用原有方法依赖源代码获得合法虚函数集合或将所有虚函数视为合法集合的检测策略,具有较高检测精度和速度,提高代码重利用攻击检测的准确性、通用性和效率。
【附图说明】
[0035]图1是本发明基于虚函数表继承关系的代码重利用攻击检测方法的流程示意图;
[0036]图2是本发明虚函数调用点识别过程的流程示意图;
[0037]图3是本发明虚函数表识别过程的流程示意图;
[0038]图4是本发明虚函数读取流程图;
[0039]图5是本发明虚函数表继承关系识别过程的流程示意图;
[0040]图6是本发明虚函数表指针初始化信息生成流程图;
[0041 ]图7是本发明防护检测过程的流程示意图。
【具体实施方式】
[0042]以下描述和附图充分地示出本发明的具体实施方案,以使本领域的技术人员能够实践它们。其他实施方案可以包括结构的、逻辑的、电气的、过程的以及其他的改变。实施例仅代表可能的变化。除非明确要求,否则单独的部件和功能是可选的,并且操作的顺序可以变化。一些实施方案的部分和特征可以被包括在或替换其他实施方案的部分和特征。
[0043]如图1所示,在一些说明性的实施例中,提供一种基于虚函数表继承关系的代码重利用攻击检测方法,包括:
[0044]101:预处理。对可执行文件进行预处理,生成中间语言文件,包括:利用二进制程序行为监测分析平台的工具toil,以所述可执行文件为输入,对所述可执行文件中的代码段进行反汇编转换为中间语言,并输出中间语言文件。
[0045]102:虚函数调用点识别。针对所述中间语言文件进行数据流分析,识别出所述中间语言文件中的虚函数调用点集合,作为运行时防护的检测点。所述虚函数调用点是指程序中虚函数调用的指令,所述虚函数调用点的数据结构包括:指令所在的地址,即其数据结构直接以该指令所在的地址表示。
[0046]103:虚函数表识别。扫描所述可执行文件,检测所述可执行文件中的虚函数表集合并得到所有虚函数表中的虚函数。虚函数表的数据结构包括两项,一是虚函数表所在的地址,二是虚函数表中的所有虚函数的地址组成的集合。
[0047]104:虚函数表继承关系识别。结合所述中间语言文件和所述虚函数表集合,分析得出虚函数表之间的继承关系,作为运行时检测代码重利用攻击的依据。
[0048]若一个类的虚函数表继承自其基类的虚函数表,则称这两个虚函数表之间有继承关系,继承关系具有传递性。虚函数表继承关系的数据结构为一个集合,所述集合的元素为关联虚函数表集合,所述关联虚函数表集合是指由虚函数表组成的集合,所述关联虚函数表集合中的所有虚函数表之间具有继承关系。任意一个虚函数表都存在于一个唯一的关联虚函数集合中,且任意两个有继承关系的虚函数表在同一个关联虚函数集合中。
[0049]105:防护检测。利用虚函数表继承关系对程序进行运行时防护,验证虚函数调用的合法性,检测代码重利用攻击。
[0050]在一些说明性的实施例中,如图2所示,步骤102包括:
[0051]201:扫描整个程序,找出其中所有的间接函数调用点,生成间接函数调用点集合。间接函数调用点指程序中的间接函数调用指令,其数据结构以指令所在的地址表示。
[0052]202:在所述间接函数调用点集合中依次取一个间接函数调用点。
[0053]203:判断是否取到间接函数调用点,若取到间接函数调用点,则进行步骤204,否贝1J,进行步骤211。
[0054]204:在取出的间接函数调用点处开始进行逆向数据流分析,直到该函数开头,得到目的地址在函数开头位置处时的表达式。逆向数据流分析表示对程序中的某项数据,从某条指令处开始向前扫描,当经过对该数据处理的指令时,对指令的表达式进行更新。[°°55] 205:将得到的函数调用目的地址表达式与形式deref (deref (exp)+Tval)相比较。形式deref (deref (exp)+Tval)为虚函数调用时,跳转的目的地址的表达式经过逆向数据流分析之后,应当表现出来的形式,其中,deref表示对数据解引用,exp为任意的表达式,Tval为立即数,其值大于或等于零。
[0056]206:判断步骤205中的比较结果是否符合,若符合,则进行步骤207,否则,进行步骤202。
[0057]207:对间接调用的第一个参数从传参的位置处开始进行逆向数据流分析,直到函数开头,得到参数在函数开头位置处的表达式。
[0058]208:将参数在函数开头位置处的表达式与所述函数调用目的地址表达式中的exp进行比较。
[0059]209:判断步骤208中的比较结果是否符合,若符合,则进行步骤210,否则,进行步骤202。
[0060]210:将所述间接函数调用点加入虚函数调用点集合。
[0061 ] 211:结束,虚函数调用点集合生成完成。
[0062]在一些说明性的实施例中,如图3所示,步骤103包括:
[0063]301:扫描可执行文件,找出出现的所有立即数并存在立即数链表中。
[0064]302:从立即数链表中取一个立即数。
[0065]303:判断是否取到立即数,若取到立即数,则进行步骤304,否则进行步骤309。
[0066]304:以立即数为指针,判断立即数指向的区域是否为只读数据区,若指向只读区域,则进行步骤305,否则进行步骤302。
[0067]305:从所述立即数指向的地址取数据,以取到的数据为指针。
[0068]306:判断所述指针是否指向合法指令地址,若指向合法指令地址,则进行步骤307,否则,进行步骤302。
[0069]307:读取虚函数表中的虚函数。
[0070]308:将读取的虚函数表加入虚函数表集合。
[0071]309:结束。
[0072]在一些说明性的实施例中,如图4所示,所述步骤307包括:
[0073]401:从虚函数表的地址处依次读取数据,读取下一条数据。
[0074]402:判断步骤401中是否读取到数据,若读取到数据,进行步骤403,否则,进行步骤406。
[0075]403:以取到的数据为指针,查看其指向的位置。
[0076]404:判断指针是否指向合法指令地址,若指向合法指令地址,则进行步骤405,否贝丨J,进行步骤406。
[0077]405:将此虚函数加入虚函数表集合。
[0078]406:结束。
[0079]在一些说明性的实施例中,如图5所示,步骤104包括:
[0080]501:在程序中依次取出一个函数。
[0081]502:判断是否取出函数,若取出函数,则进行步骤503,否则,进行步骤507。
[0082]503:对取出的函数进行数据流分析,得到虚函数表指针初始化信息集合。
[0083]504:从所述虚函数表指针初始化信息集合依次取一条虚函数表指针初始化信息。
[0084]505:判断是否取出虚函数表指针初始化信息,若取出虚函数表指针初始化信息,则进行步骤506,否则,进行步骤501。
[0085]506:将取出的虚函数表指针初始化信息中的虚函数表集合插入虚函数表继承关系。插入过程包括:若待插入的虚函数表集合与虚函数表继承关系中的某个虚函数表集合有交集,则将两个集合合并,否则,将待插入的虚函数表集合直接插入虚函数表继承关系中。
[0086]507:结束。
[0087]虚函数表指针初始化信息包括一个虚函数表指针,一个虚函数表集合。虚函数表指针以程序中的一个表达式表示,虚函数表集合中为该虚函数表指针可能指向的所有虚函数表。
[0088]其中,如图6所示,虚函数表指针初始化信息生成流程包括:
[0089]601:扫描得到本函数以及本函数直接调用的所有函数中的虚函数表指针初始化指令。
[0090]602:取一条虚函数表指针初始化指令。
[0091]603:判断是否取到虚函数表指针初始化指令,若取到虚函数表指针初始化指令,则进行步骤604,否则,进行步骤610。
[0092]604:对指令的目的操作数进行逆向数据流分析,得到虚函数表指针表达式。
[0093]605:从虚函数表指针初始化信息集合中查找包含该虚函数表指针的虚函数表指针初始化信息。
[0094]606:判断是否查找到虚函数表指针初始化信息,若查找到虚函数表指针初始化信息,则进行步骤609,否则,进行步骤607。
[0095]607:根据虚函数表指针的表达式,以及指令的源操作数创建一条虚函数表指针初始化信息。
[0096]608:将新创建的虚函数表指针初始化信息插入虚函数表指针初始化信息集合。
[0097]609:将指令的源操作数插入找到的虚函数表指针初始化信息的虚函数表集合中。
[0098]610:结束。
[0099]虚函数表指针初始化指令为对虚函数表指针进行初始化的指令,以该指令的地址表不。
[0100]在一些说明性的实施例中,如图7所示,步骤105包括:
[0101]701:启动二进制插粧平台,载入应用程序的可执行文件。
[0102]702:从可执行文件依次取指令。
[0103]703:判断是否取到指令,若取到指令,进行步骤704,否则,进行步骤715。
[0104]704:在所述虚函数调用点集合中查找取出的指令的地址。
[0105]705:判断是否查找到取出的指令的地址,若查找到,进行步骤706,否则,进行步骤714。
[0106]706:取虚函数调用点所绑定的关联虚函数表集合。
[0107]707:判断是否取到关联虚函数表集合,若取到,则进行步骤708,否则,进行步骤710。
[0108]708:在关联虚函数表集合中的虚函数表中查找目的地址。
[0109]709:判断是否查找到目的地址,若查找到目的地址,则进行步骤714,否则,进行步骤 712。
[0110]710:根据目的地址查找关联虚函数表集合。
[0111]711:判断是否查找到关联虚函数表集合,若查找到关联虚函数表集合,则进行步骤713,否则进行步骤712。
[0112]712:进行报告,报告检测到了代码重利用攻击。
[0113]713:绑定虚函数调用点与关联虚函数集合。
[0114]714:执行指令。
[0115]715:结束,终止程序。
[0116]本领域技术人员还应当理解,结合本文的实施例描述的各种说明性的逻辑框、模块、电路和算法步骤均可以实现成电子硬件、计算机软件或其组合。为了清楚地说明硬件和软件之间的可交换性,上面对各种说明性的部件、框、模块、电路和步骤均围绕其功能进行了一般地描述。至于这种功能是实现成硬件还是实现成软件,取决于特定的应用和对整个系统所施加的设计约束条件。熟练的技术人员可以针对每个特定应用,以变通的方式实现所描述的功能,但是,这种实现决策不应解释为背离本公开的保护范围。
【主权项】
1.基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,包括: 预处理:对可执行文件进行预处理,生成中间语言文件; 虚函数调用点识别:针对所述中间语言文件进行数据流分析,识别出所述中间语言文件中的虚函数调用点集合,作为运行时防护的检测点; 虚函数表识别:扫描所述可执行文件,检测所述可执行文件中的虚函数表集合并得到所有虚函数表中的虚函数; 虚函数表继承关系识别:结合所述中间语言文件和所述虚函数表集合,分析得出虚函数表之间的继承关系,作为运行时检测代码重利用攻击的依据; 防护检测:利用虚函数表继承关系对程序进行运行时防护,验证虚函数调用的合法性,检测代码重利用攻击。2.根据权利要求1所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于, 所述虚函数调用点是指程序中虚函数调用的指令,所述虚函数调用点的数据结构包括:指令所在的地址; 所述虚函数表的数据结构包括:虚函数表所在的地址及虚函数表中的所有虚函数的地址组成的集合; 虚函数表继承关系的数据结构为一个集合,所述集合的元素为关联虚函数表集合,所述关联虚函数表集合是指由虚函数表组成的集合,所述关联虚函数表集合中的所有虚函数表之间具有继承关系。3.根据权利要求1或2所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述预处理的过程包括:利用二进制程序行为监测分析平台,以所述可执行文件为输入,对所述可执行文件中的代码段进行反汇编转换为中间语言,并输出中间语言文件。4.根据权利要求3所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述虚函数调用点识别的过程包括: 生成间接函数调用点集合; 在所述间接函数调用点集合中依次取一个间接函数调用点; 在取出的间接函数调用点处开始进行逆向数据流分析,得到函数调用目的地址表达式; 将所述函数调用目的地址表达式与形式deref (deref (exp)+Tval)相比较; 若比较结果为符合,对间接调用的第一个参数从传参的位置处开始进行逆向数据流分析,直到函数开头,得到参数在函数开头位置处的表达式; 将所述参数在函数开头位置处的表达式与所述函数调用目的地址表达式中的exp进行比较; 若比较结果为符合,将所述间接函数调用点加入虚函数调用点集合。5.根据权利要求3所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述虚函数表识别的过程包括: 扫描所述可执行文件,找出出现的所有立即数并存在立即数链表中; 从所述立即数链表中取一个立即数; 以所述立即数为指针,判断所述立即数指向的区域是否为只读数据区; 若所述立即数指向的区域为只读数据区,从所述立即数指向的地址取数据,以取到的数据为指针; 若所述指针指向合法指令地址,读取虚函数表中的虚函数; 将读取的虚函数表加入虚函数表集合。6.根据权利要求3所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述虚函数表继承关系识别的过程包括: 在程序中依次取出一个函数; 对取出的函数进行数据流分析,得到虚函数表指针初始化信息集合; 从所述虚函数表指针初始化信息集合依次取一条虚函数表指针初始化信息; 将取出的虚函数表指针初始化信息中的虚函数表集合插入虚函数表继承关系。7.根据权利要求6所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述将取出的虚函数表指针初始化信息中的虚函数表集合插入虚函数表继承关系的过程包括: 若待插入的虚函数表集合与虚函数表继承关系中的某个虚函数表集合有交集,则将两个集合合并,否则,将待插入的虚函数表集合直接插入虚函数表继承关系中。8.根据权利要求3所述的基于虚函数表继承关系的代码重利用攻击检测方法,其特征在于,所述防护检测的过程包括:. 701:启动二进制插粧平台,载入应用程序的可执行文件; . 702:从可执行文件依次取指令; . 703:判断是否取到指令,若取到指令,进行步骤704,否则进行步骤715; .704:在所述虚函数调用点集合中查找取出的指令的地址; . 705:判断是否查找到取出的指令的地址,若查找到,进行步骤706,否则,进行步骤714; . 706:取虚函数调用点所绑定的关联虚函数表集合; . 707:判断是否取到关联虚函数表集合,若取到,则进行步骤708,否则,进行步骤710; .708:在关联虚函数表集合中的虚函数表中查找目的地址; .709:判断是否查找到目的地址,若查找到目的地址,则进行步骤714,否则,进行步骤.712; .710:根据目的地址查找关联虚函数表集合;. 711:判断是否查找到关联虚函数表集合,若查找到关联虚函数表集合,则进行步骤.713,否则进行步骤712; . 712:进行报告,报告检测到了代码重利用攻击; .713:绑定虚函数调用点与关联虚函数集合; .714:执行指令; .715:结束,终止程序。
【文档编号】G06F11/36GK106021110SQ201610349067
【公开日】2016年10月12日
【申请日】2016年5月24日
【发明人】曾庆凯, 朱伟
【申请人】南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1