CN107368742B - 基于gcc的细粒度虚函数表劫持攻击防御方法 - Google Patents
基于gcc的细粒度虚函数表劫持攻击防御方法 Download PDFInfo
- Publication number
- CN107368742B CN107368742B CN201710702166.1A CN201710702166A CN107368742B CN 107368742 B CN107368742 B CN 107368742B CN 201710702166 A CN201710702166 A CN 201710702166A CN 107368742 B CN107368742 B CN 107368742B
- Authority
- CN
- China
- Prior art keywords
- virtual function
- class
- pointer
- target set
- function table
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了基于GCC的细粒度虚函数表劫持攻击防御方法,该种方法包括以下步骤:第一,收集类继承关系和类对应的虚函数表;第二,构建合法目标集合;第三,识别虚函数的调用点并插桩验证函数;第四,运行时生成验证数据;第五,虚函数调用的合法性验证。该种防御方法通过对源程序的中间码表示进行分析,获得较为准确的类的继承关系的情况下,以虚函数调用点的具体的对象类型和所调用的虚函数为依据,为虚函数调用点构造更为精确的合法目标集合,提升了虚函数表劫持攻击防御方法的准确性,同时也保证了防御方法的兼容性和性能。
Description
技术领域
本发明是涉及虚函数表劫持攻击防御领域,具体的说是基于GCC的细粒度虚函数表劫持攻击防御方法。
背景技术
在C++程序中,为了实现动态绑定机制,编译器为程序中包含虚函数成员的类生成了虚函数表,并为相应的对象生成了指向虚函数表的指针。虚函数表劫持攻击通过利用C++程序中的漏洞(如u-a-f、缓冲区溢出漏洞等),篡改虚函数表或者指向虚函数表的指针来改变虚函数的实际调用目标,从而劫持控制流。由于虚函数调用在C++程序中大量存在(比如谷歌浏览器中有91.8%的间接call是虚函数调用),因此虚函数表劫持攻击具有极大的危害性。针对虚函数和虚函数表实施验证保护是防御虚函数表劫持攻击的重要手段之一。目前的防御方法通过静态分析源码或者二进制程序中虚函数调用点的信息来构造可访问的合法目标集合(即虚函数集合或者虚函数表集合),并通过代码插桩实现运行时检查来验证动态的虚函数调用的合法性,从而保证程序的控制流完整性。其中,合法目标集合的准确性是保证防御方法有效的关键因素。现有的防御方法在安全性方面依然有待提高,同时兼容性和开销等问题也影响着防御方法的执行效率。
发明内容
本发明要解决的技术问题是提供基于GCC的细粒度虚函数表劫持攻击防御方法,该种防御方法提升了虚函数表劫持攻击防御方法的准确性,同时也保证了防御方法的兼容性和性能。
为解决上述技术问题,本发明采用的技术方案为:
基于GCC的细粒度虚函数表劫持攻击防御方法,其特征是:在保证兼容性和性能的情况下,解决虚函数表劫持攻击防御方法存在的准确性问题,具体步骤如下:
步骤1,收集类继承关系和类对应的虚函数表,GCC语法分析阶段构造类的继承关系图,并为每个类记录其所有的虚函数表指针;
步骤2,构建合法目标集合,根据虚函数调用点分析出具体的对象类型、被调用函数以及类的继承关系等信息,为虚函数调用点生成模块内的合法目标集合,然后为程序生成构造初始化函数,该函数运行时构建全局的合法目标集合,作为运行时检测虚函数表劫持攻击的依据;
步骤3,识别虚函数的调用点并插桩验证函数,针对GCC为程序生成的Gimple中间码进行分析, 遍历程序基本块识别出虚函数调用点,判断是否符合优化条件并选择对应的验证函数,***到虚函数调用点,以便在程序执行时实施合法性验证;
步骤4,运行时生成验证数据,程序执行前会先执行构造初始化函数,在运行时生成全局的合法目标集合,作为虚函数调用的合法性验证的依据;
步骤5,虚函数调用的合法性验证,根据所插桩的验证函数,在虚函数调用执行时,将进行合法性验证:以合法目标集合为验证依据,验证目前虚函数调用的合法性,检测虚函数表劫持攻击。
为优化上述发明,采取的具体措施还包括:
所述的步骤1的具体步骤如下:
201:扫描中间码,识别程序中所有的类,生成所有的类的集合,利用GCC的宏RECORD_TYPE可识别程序中的类;
202:在所述的类的集合中依次选取一个类;
203:判断是否取到类,若取到,则进行步骤204,否则进行步骤208;
204:通过取到的类,利用宏BINFO获取类的虚函数表,并为类保存其相关的虚函数表集合,所述类的虚函数表集合,在单继承情况下包括该类本身及其父类结合的单一虚函数表,在多重继承情况下包括其父类的虚函数表部分和该类本身的虚函数表部分;
205:获取该类的父类,宏BINFO被用来代表父类,利用BINFO获取该类的父类;
206:判断是否取到该类的父类,若取到,则进行步骤207,否则进行步骤202,继续取集合中的类,收集相关数据;
207:通过步骤206找到了该类的父类,从而构造该类与其父类的继承关系,将两个类加入到继承关系图中;
208:结束,完成类继承关系和类对应的虚函数表的收集工作。
所述的步骤2的具体步骤如下:
301:遍历类继承关系图,从步骤1产生的类继承关系图中取一个类;
302:判断是否取到类,若取到,则进行步骤302,否则进行步骤319;
303:获取类之后,先遍历类的虚函数,获取类的虚函数;
304:判断是否取到虚函数,若取到,则进行步骤305,否则进行步骤312;
305:获取虚函数后,判断该虚函数在该类的子类中是否有定义,来确定当该类型的对象调用此虚函数时,本发明为这样的调用点生成的合法目标集合是否可以优化;
306:判断是否有定义,若没有,则进行步骤307,说明可以优化,否则进行步骤303,依次取该类的虚函数;
307:结合类型与虚函数两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数构造出来的合法目标集合,将该全局变量放入可优化集合;
308:以307所述的全局变量和当前取的虚函数指针为参数,生成一个函数调用,该函数调用在运行时执行,将传入的虚函数指针添加到合法虚函数集合中,作为验证数据;
309:获取类的子类,某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及该类的子类中的虚函数,所以要取子类的虚函数指针并添加到合法目标集合;
310:判断是否取到子类,若取到,则进行步骤311,否则进行步骤303;
311:获取子类中该虚函数的指针,之后进行步骤308;
312:获取类的虚函数表子部分,根据该类的虚函数是否被子类重定义找出可以优化的情况后,依然要处理一般情况下构造的合法目标集合的情况,一个类的虚函数表集合,在单继承情况下包括该类本身及其父类结合的单一虚函数表,在多重继承情况下包括其父类的虚函数表部分和该类本身的虚函数表部分;
313:判断是否取到虚函数表部分,若取到,则进行步骤314,否则进行步骤301;
314:结合类与虚函数表子部分两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数子部分构造出来的合法目标集合;
315:以314所述的全局变量和当前取的虚函数表子部分的指针为参数,生成一个函数调用,该函数调用在运行时执行,将传入的虚函数表指针***到合法虚函数表集合中,作为验证数据;
316:获取该类的子类,某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及其子类中的虚函数,所以要将子类中的这部分虚函数表指针添加到合法目标集合;
317:判断是否取到子类,若取到,则进行步骤318,否则进行步骤312;
318:在子类中匹配到相应的虚函数表部分,获取子类中该部分虚函数表指针,随后进行步骤315;
319:结束。
所述的步骤3的具体步骤如下:
401:依次获取程序基本块;
402:判断是否取到基本块,若取到,则进行步骤403,否则进行步骤412;
403:扫描基本块,获取基本块中的中间码语句;
404:判断是否取到中间码语句,若取到,则进行步骤405,否则进行步骤401,完成该基本块的扫描;
405:判断取到的语句是不是虚函数调用,若是,则进行步骤406,否则进行步骤403,取下一条语句;
406:分析虚函数调用点,获取进行调用的对象的类型、被调用的虚函数和包含该虚函数的虚函数表部分,所述的包含该虚函数的虚函数表部分,也就是通过虚函数所在虚函数表位置而确定的虚函数表子部分;
407:通过对象类型和虚函数可以索引过程步骤2中生成的全局变量,并检查全局变量是否有可优化的标记;
408:检查当前的全局变量是否有可优化的标记,若有,则进行步骤409,否则进行步骤410;
409: 插桩验证函数,该函数以当前的全局变量和运行时实际调用的虚函数指针为参数;
410:不用优化,则保持原来的合法目标集合,通过对象类型和虚函数表子部分索引全局变量;
411:插桩验证函数,该函数以当前的全局变量和运行时实际使用的虚函数表指针为参数;
412:结束。
所述的步骤4的具体步骤如下:
501:获取用来索引合法目标集合的全局变量,步骤2中生成的构造全局合法目标集合的函数的其中一个参数:唯一标识的全局变量;
502:获取要添加到合法目标集合的指针,包括虚函数指针或者虚函数表指针,步骤2中生成的构造全局合法目标集合的函数的另一个参数:虚函数指针或者虚函数表指针;
503:判断该全局变量是否为空,若是,则进行步骤506,否则进行步骤504;
504:通过全局变量索引对应的合法目标集合;
505:将指针添加到合法目标集合,所述的指针为虚函数指针或者虚函数表指针;
506:依据该全局标量构造合法目标集合,也就是一个哈希表,建立该全局变量与合法目标集合的索引,随后执行505,将指针添加到合法目标集合里;
507:结束。
所述的步骤5的具体步骤如下:
601:获取当前虚函数表指针或者虚函数指针,步骤3***的验证函数的参数;
602:获取合法目标集合,步骤3***的验证函数的参数是静态产生的全局变量,通过该全局变量索引合法目标集合;
603:在合法目标集合里查找当前使用的指针,所述的指针为虚函数指针或者虚函数表指针;
604:判断在合法目标集合里是否查找到当前指针,若查找到当前指针,则进行步骤606,否则进行步骤605;
605:当前使用的指针不在合法的目标集合里,说明发生了虚函数表劫持攻击,报告攻击;
606:虚函数调用是合法的,允许调用;
607:结束。
本方法提出一种基于GCC的细粒度虚函数表劫持攻击防御方法。C++动态绑定原理是在虚函数调用点通过动态的对象类型来确定实际调用的虚函数实现的过程。当子类没有对父类的某个虚函数重新定义时,该虚函数被父类或者子类的对象调用时会动态绑定到唯一版本的虚函数实现。在这种情况(包括多继承的场景)下,虚函数调用点的合法目标虚函数集合将比合法目标虚函数表集合要小甚至小很多,且能精确到具体的虚函数。据此,本发明为满足此类情况的虚函数调用点构造更准确的合法目标集合。本方法基于GCC分析程序的中间码得到虚函数调用点的对象类型和所调用的虚函数,利用中间码中的宏DECL_CONTET来确定虚函数调用点所调用的虚函数在对象类型的子类型中是否被重新定义。若没有被重新定义,说明虚函数调用点满足上述情况,则为此类虚函数调用点生成更准确的、较小的合法目标虚函数集合。由于缩小了合法目标集合,虚函数调用运行时的验证效率得到提高。因此,本方法可提升虚函数表劫持攻击防御方法的准确性和执行效率。
本发明基于GCC的细粒度虚函数表劫持攻击防御方法的有益效果为:在GCC的基础上,通过对源程序的中间码表示进行分析,获得较为准确的类的继承关系的情况下,以虚函数调用点的具体的对象类型和所调用的虚函数为依据,为虚函数调用点构造更为精确的合法目标集合,提升了虚函数表劫持攻击防御方法的准确性,同时也保证了防御方法的兼容性和性能。
附图说明
图1为本发明基于GCC的细粒度虚函数表劫持攻击防御方法的流程图。
图2为本发明基于GCC的细粒度虚函数表劫持攻击防御方法收集类继承关系和类对应的虚函数表的流程图。
图3为本发明基于GCC的细粒度虚函数表劫持攻击防御方法构建合法目标集合的流程图。
图4为本发明基于GCC的细粒度虚函数表劫持攻击防御方法识别虚函数的调用点并插桩验证函数的流程图。
图5为本发明基于GCC的细粒度虚函数表劫持攻击防御方法运行时生成验证数据的流程图。
图6为本发明基于GCC的细粒度虚函数表劫持攻击防御方法虚函数调用的合法性验证的流程图。
具体实施方式
以下结合说明书附图和具体优选的实施例对本发明作进一步描述。
如图1所示,一种基于GCC的细粒度虚函数表劫持攻击防御方法,整体结构和工作原理包括:
101: 收集类继承关系和类对应的虚函数表。GCC编译过程中的语法分析阶段生成中间语言,分析中间语言识别出程序中的类,构建类的继承关系图,并为每个类记录其虚函数表集合,作为构造合法目标集合的基础。GCC中,宏RECORD_TYPE表示通过struct或者class声明的类型,可以识别程序中的类。每个类都有宏BINFO来关联父类和子类,利用BINFO可得到类的父类和虚函数表信息。单继承情况下,一个类的虚函数表集合只包括该类本身及其父类结合的单一虚函数表。多重继承情况下,一个类的虚函数表集合包括其父类的虚函数表部分和该类本身的虚函数表部分。
102:构建合法目标集合。根据虚函数调用点分析出具体的对象类型、被调用函数以及类的继承关系等信息,为虚函数调用点生成模块内的合法目标集合。然后为程序生成构造初始化函数,运行时构建全局的合法目标集合,作为运行时检测虚函数表劫持攻击的依据。所述合法目标集合分为包含虚函数的合法虚函数集合,包含虚函数表指针的合法虚函数表集合。中间码的宏DECL_CONTET作用于虚函数时会返回定义该虚函数的类,以此可确定一个类的虚函数在其子类中是否被重定义,作为是否优化目标集合的依据。
103:识别虚函数的调用点并插桩验证函数。针对GCC为程序生成的Gimple中间码进行分析,遍历程序基本块识别出虚函数调用点,判断是否符合优化条件选择插桩不同的验证函数,最后在虚函数调用点***验证函数,以便在程序执行时进行虚函数调用的合法性验证。所述虚函数调用点是指程序中调用虚函数的指令。Gimple中的宏GIMPLE_CALL代表call表达式,而宏OBJ_TYPE_REF可以用来确定该call表达式是否为虚函数调用,从而确定虚函数调用点。
104:运行时生成验证数据。程序执行前会先执行构造初始化函数,在运行时生成全局的合法目标集合,作为虚函数调用的合法性验证的依据。所述的构造初始化函数就是运行时构造全局合法目标集合的函数,部署在目标文件中,在程序的start之后,main之前执行。
105:虚函数调用的合法性验证。根据所插装的验证函数,当虚函数调用执行时,进行合法性验证:以合法目标集合为验证依据,验证目前虚函数调用的合法性,检测虚函数表劫持攻击。
如图2所示,步骤101收集类继承关系和类对应的虚函数表流程。该流程通过扫描中间码,利用GCC的宏得到需要的基础数据:类的继承关系和类对应的虚函数表集合,为构造合法目标集合做准备。步骤包括:
201:扫描中间码,识别程序中所有的类,生成所有的类的集合。利用GCC的宏RECORD_TYPE可识别程序中的类。
202:在所述的类的集合中依次选取一个类。
203:判断是否取到类,若取到,则进行步骤204,否则进行步骤208。
204:通过取到的类,利用宏BINFO获取类的虚函数表,并为类保存其相关的虚函数表集合。所述类的虚函数表集合,在单继承情况下包括该类本身及其父类结合的单一虚函数表。在多重继承情况下包括其父类的虚函数表部分和该类本身的虚函数表部分。
205:获取该类的父类。宏BINFO被用来代表父类,利用BINFO获取该类的父类。
206:判断是否取到该类的父类,若取到,则进行步骤207,否则进行步骤202,继续取集合中的类,收集相关数据。
207:通过步骤206找到了该类的父类,从而构造该类与其父类的继承关系,将两个类加入到继承关系图中。
208:结束,完成类继承关系和类对应的虚函数表的收集工作。
如图3所示,步骤102具体步骤包括:
301:遍历类继承关系图,从101步骤产生的类继承关系图中取一个类。
302:判断是否取到类,若取到,则进行步骤302,否则进行步骤319。
303:获取类之后,先遍历类的虚函数,获取类的虚函数。
304:判断是否取到虚函数,若取到,则进行步骤305,否则进行步骤312。
305:获取虚函数后,判断该虚函数在该类的子类中是否有定义,来确定当该类型的对象调用此虚函数时,本发明为这样的调用点生成的合法目标集合是否可以优化。
306:判断是否有定义,若没有,则进行步骤307,说明可以优化,否则进行步骤303,依次取该类的虚函数。
307:结合类型与虚函数两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数构造出来的合法目标集合,将该全局变量放入可优化集合。
308:以307所述的全局变量和当前取的虚函数指针为参数,生成一个函数调用。该函数调用在运行时执行,将传入的虚函数指针添加到合法虚函数集合中,作为验证数据。
309:获取类的子类。某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及该类的子类中的虚函数,所以要取子类的虚函数指针并添加到合法目标集合。
310:判断是否取到子类,若取到,则进行步骤311,否则进行步骤303。
311:获取子类中该虚函数的指针,之后进行步骤308。
312:获取类的虚函数表子部分。根据该类的虚函数是否被子类重定义找出可以优化的情况后,依然要处理一般情况下构造的合法目标集合的情况。一个类的虚函数表集合,在单继承情况下包括该类本身及其父类结合的单一虚函数表。在多重继承情况下包括其父类的虚函数表部分和该类本身的虚函数表部分。
313:判断是否取到虚函数表部分,若取到,则进行步骤314,否则进行步骤301。
314:结合类与虚函数表子部分两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数子部分构造出来的合法目标集合。
315:以314所述的全局变量和当前取的虚函数表子部分的指针为参数,生成一个函数调用。该函数调用在运行时执行,将传入的虚函数表指针***到合法虚函数表集合中,作为验证数据。
316:获取该类的子类。某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及其子类中的虚函数,所以要将子类中的这部分虚函数表指针添加到合法目标集合。
317:判断是否取到子类,若取到,则进行步骤318,否则进行步骤312。
318:在子类中匹配到相应的虚函数表部分,获取子类中该部分虚函数表指针,随后进行步骤315。
319:结束。
如图4所示,识别虚函数的调用点并插桩验证函数的流程包括:
401:依次获取程序基本块。
402:判断是否取到基本块,若取到,则进行步骤403,否则进行步骤412。
403:扫描基本块,获取基本块中的中间码语句。
404:判断是否取到中间码语句,若取到,则进行步骤405,否则进行步骤401,完成该基本块的扫描。
405:判断取到的语句是不是虚函数调用,若是,则进行步骤406,否则进行步骤403,取下一条语句。
406:分析虚函数调用点,获取进行调用的对象的类型、被调用的虚函数和包含该虚函数的虚函数表部分。所述的包含该虚函数的虚函数表部分,也就是通过虚函数所在虚函数表位置而确定的虚函数表子部分。
407:通过对象类型和虚函数可以索引过程102中生成的全局变量,并检查全局变量是否有可优化的标记。
408:检查当前的全局变量是否有可优化的标记,若有,则进行步骤409,否则进行步骤410。
409: 插桩验证函数,该函数以当前的全局变量和运行时实际调用的虚函数指针为参数。
410:不用优化,则保持原来的合法目标集合。通过对象类型和虚函数表子部分索引全局变量。
411:插桩验证函数,该函数以当前的全局变量和运行时实际使用的虚函数表指针为参数。
412:结束。
如图5所示,步骤104具体步骤包括:
501:获取用来索引合法目标集合的全局变量。步骤102中生成的构造全局合法目标集合的函数的其中一个参数:唯一标识的全局变量。
502:获取要添加到合法目标集合的指针,包括虚函数指针或者虚函数表指针。步骤102中生成的构造全局合法目标集合的函数的另一个参数:虚函数指针或者虚函数表指针。
503:判断该全局变量是否为空,若是,则进行步骤506,否则进行步骤504。
504:通过全局变量索引对应的合法目标集合。
505:将指针(虚函数指针或者虚函数表指针)添加到合法目标集合。
506:依据该全局标量构造合法目标集合,也就是一个哈希表,建立该全局变量与合法目标集合的索引。随后执行505,将指针添加到合法目标集合里。
507:结束。
如图6所示,步骤105虚函数调用的合法性验证流程包括:
601:获取当前虚函数表指针或者虚函数指针。过程103***的验证函数的参数。
602:获取合法目标集合。过程103***的验证函数的参数是静态产生的全局变量,通过该全局变量索引合法目标集合。
603:在合法目标集合里查找当前使用的指针(虚函数表指针或者虚函数指针)。
604:判断在合法目标集合里是否查找到当前指针,若查找到当前指针,则进行步骤606,否则进行步骤605。
605:当前使用的指针不在合法的目标集合里,说明发生了虚函数表劫持攻击,报告攻击。
606:虚函数调用是合法的,允许调用。
607:结束。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (3)
1.基于GCC的细粒度虚函数表劫持攻击防御方法,其特征是:
步骤1,收集类继承关系和类对应的虚函数表,GCC语法分析阶段构造类的继承关系图,并为每个类记录其所有的虚函数表指针;
步骤2,构建合法目标集合,根据虚函数调用点分析出具体的对象类型、被调用函数以及类的继承关系信息,为虚函数调用点生成模块内的合法目标集合,然后为程序生成构造初始化函数,该函数运行时构建全局的合法目标集合,作为运行时检测虚函数表劫持攻击的依据;所述的步骤2的具体步骤如下:
步骤301:遍历类继承关系图,从步骤1产生的类继承关系图中取一个类;
步骤302:判断是否取到类,若取到,则进行步骤303,否则进行步骤319;
步骤303:获取类之后,先遍历类的虚函数,获取类的虚函数;
步骤304:判断是否取到虚函数,若取到,则进行步骤305,否则进行步骤312;
步骤305:获取虚函数后,判断该虚函数在该类的子类中是否有定义,来确定当该类型的对象调用此虚函数时,判断此虚函数调用点生成的合法目标集合是否可以优化;
步骤306:判断是否有定义,若没有,则进行步骤307,说明可以优化,否则进行步骤303,依次取该类的虚函数;
步骤307:结合类型与虚函数两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数构造出来的合法目标集合,将该全局变量放入可优化集合;
步骤308:以步骤307所述的全局变量和当前取的虚函数指针为参数,生成一个函数调用,该函数调用在运行时执行,将传入的虚函数指针添加到合法虚函数集合中,作为验证数据;
步骤309:获取类的子类,某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及该类的子类中的虚函数,所以要取子类的虚函数指针并添加到合法目标集合;
步骤310:判断是否取到子类,若取到,则进行步骤311,否则进行步骤303;
步骤311:获取子类中该虚函数的指针,之后进行步骤308;
步骤312:获取类的虚函数表子部分,根据该类的虚函数是否被子类重定义找出可以优化的情况后,执行步骤313;步骤313:判断是否取到虚函数表部分,若取到,则进行步骤314,否则进行步骤301;
步骤314:结合类与虚函数表子部分两个因素,构造一个可以唯一标识的全局变量,用来索引针对该类型与虚函数子部分构造出来的合法目标集合;
步骤315:以步骤314所述的全局变量和当前取的虚函数表子部分的指针为参数,生成一个函数调用,该函数调用在运行时执行,将传入的虚函数表指针***到合法虚函数表集合中,作为验证数据;
步骤316:获取该类的子类,某类型的对象调用虚函数时,由于多态的存在,该对象可以调用该类本身的虚函数以及其子类中的虚函数,所以要将子类中的这部分虚函数表指针添加到合法目标集合;
步骤317:判断是否取到子类,若取到,则进行步骤318,否则进行步骤312;
步骤318:在子类中匹配到相应的虚函数表部分,获取子类中该部分虚函数表指针,随后进行步骤315;
步骤319:结束;
步骤3,识别虚函数的调用点并插桩验证函数,针对GCC为程序生成的Gimple中间码进行分析, 遍历程序基本块识别出虚函数调用点,判断是否符合优化条件并选择对应的验证函数,***到虚函数调用点,以便在程序执行时实施合法性验证;所述的步骤3的具体步骤如下:
步骤401:依次获取程序基本块;
步骤402:判断是否取到基本块,若取到,则进行步骤403,否则进行步骤412;
步骤403:扫描基本块,获取基本块中的中间码语句;
步骤404:判断是否取到中间码语句,若取到,则进行步骤405,否则进行步骤401,完成该基本块的扫描;
步骤405:判断取到的语句是不是虚函数调用,若是,则进行步骤406,否则进行步骤403,取下一条语句;
步骤406:分析虚函数调用点,获取进行调用的对象的类型、被调用的虚函数和包含该虚函数的虚函数表部分,所述的包含该虚函数的虚函数表部分,也就是通过虚函数所在虚函数表位置而确定的虚函数表子部分;
步骤407:通过对象类型和虚函数可以索引过程步骤307中生成的全局变量,并检查全局变量是否有可优化的标记;
步骤408:检查当前的全局变量是否有可优化的标记,若有,则进行步骤409,否则进行步骤410;
步骤409: 插桩验证函数,该函数以当前的全局变量和运行时实际调用的虚函数指针为参数;
步骤410:不用优化,则保持原来的合法目标集合,通过对象类型和虚函数表子部分索引全局变量;
步骤411:插桩验证函数,该函数以当前的全局变量和运行时实际使用的虚函数表指针为参数;
步骤412:结束;
步骤4,运行时生成验证数据,程序执行前会先执行构造初始化函数,在运行时生成全局的合法目标集合,作为虚函数调用的合法性验证的依据;所述的步骤4的具体步骤如下:
步骤501:获取用来索引合法目标集合的全局变量,步骤2中生成的构造全局合法目标集合的函数的其中一个参数:唯一标识的全局变量;
步骤502:获取要添加到合法目标集合的指针,包括虚函数指针或者虚函数表指针,步骤2中生成的构造全局合法目标集合的函数的另一个参数:虚函数指针或者虚函数表指针;
步骤503:判断该全局变量是否为空,若是,则进行步骤506,否则进行步骤504;
步骤504:通过全局变量索引对应的合法目标集合;
步骤505:将指针添加到合法目标集合,所述的指针为虚函数指针或者虚函数表指针;
步骤506:依据该全局变量构造合法目标集合,也就是一个哈希表,建立该全局变量与合法目标集合的索引,随后执行505,将指针添加到合法目标集合里;
步骤507:结束;
步骤5,虚函数调用的合法性验证,根据所插桩的验证函数,在虚函数调用执行时,将进行合法性验证:以合法目标集合为验证依据,验证目前虚函数调用的合法性,检测虚函数表劫持攻击。
2.根据权利要求1所述的基于GCC的细粒度虚函数表劫持攻击防御方法,其特征在于:所述的步骤1的具体步骤如下:
步骤201:扫描中间码,识别程序中所有的类,生成所有的类的集合,利用GCC的宏RECORD_TYPE可识别程序中的类;
步骤202:在所述的类的集合中依次选取一个类;
步骤203:判断是否取到类,若取到,则进行步骤204,否则进行步骤208;
步骤204:通过取到的类,利用宏BINFO获取类的虚函数表,并为类保存其相关的虚函数表集合,所述类的虚函数表集合,在单继承情况下包括该类本身及其父类结合的单一虚函数表,在多重继承情况下包括其父类的虚函数表部分和该类本身的虚函数表部分;
步骤205:获取该类的父类,宏BINFO被用来代表父类,利用BINFO获取该类的父类;
步骤206:判断是否取到该类的父类,若取到,则进行步骤207,否则进行步骤202,继续取集合中的类,收集相关数据;
步骤207:通过步骤206找到了该类的父类,从而构造该类与其父类的继承关系,将两个类加入到继承关系图中;
步骤208:结束,完成类继承关系和类对应的虚函数表的收集工作。
3.根据权利要求1所述的基于GCC的细粒度虚函数表劫持攻击防御方法,其特征在于:所述的步骤5的具体步骤如下:
步骤601:获取当前虚函数表指针或者虚函数指针,获取步骤3***的验证函数的参数;
步骤602:获取合法目标集合,步骤3***的验证函数的参数是静态产生的全局变量,通过该全局变量索引合法目标集合;
步骤603:在合法目标集合里查找当前使用的指针,所述的指针为虚函数指针或者虚函数表指针;
步骤604:判断在合法目标集合里是否查找到当前指针,若查找到当前指针,则进行步骤606,否则进行步骤605;
步骤605:当前使用的指针不在合法的目标集合里,说明发生了虚函数表劫持攻击,报告攻击;
步骤606:虚函数调用是合法的,允许调用;
步骤607:结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710702166.1A CN107368742B (zh) | 2017-08-16 | 2017-08-16 | 基于gcc的细粒度虚函数表劫持攻击防御方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710702166.1A CN107368742B (zh) | 2017-08-16 | 2017-08-16 | 基于gcc的细粒度虚函数表劫持攻击防御方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107368742A CN107368742A (zh) | 2017-11-21 |
CN107368742B true CN107368742B (zh) | 2022-10-18 |
Family
ID=60309996
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710702166.1A Active CN107368742B (zh) | 2017-08-16 | 2017-08-16 | 基于gcc的细粒度虚函数表劫持攻击防御方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107368742B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116340942B (zh) * | 2023-03-01 | 2024-04-30 | 软安科技有限公司 | 一种基于对象传播图和指针分析的函数调用图构建方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881610A (zh) * | 2015-06-16 | 2015-09-02 | 北京理工大学 | 一种针对虚函数表劫持攻击的防御方法 |
CN105868641A (zh) * | 2016-04-01 | 2016-08-17 | 北京理工大学 | 基于虚函数表劫持的防御方法 |
CN106021110A (zh) * | 2016-05-24 | 2016-10-12 | 南京大学 | 基于虚函数表继承关系的代码重利用攻击检测方法 |
-
2017
- 2017-08-16 CN CN201710702166.1A patent/CN107368742B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104881610A (zh) * | 2015-06-16 | 2015-09-02 | 北京理工大学 | 一种针对虚函数表劫持攻击的防御方法 |
CN105868641A (zh) * | 2016-04-01 | 2016-08-17 | 北京理工大学 | 基于虚函数表劫持的防御方法 |
CN106021110A (zh) * | 2016-05-24 | 2016-10-12 | 南京大学 | 基于虚函数表继承关系的代码重利用攻击检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107368742A (zh) | 2017-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10296447B2 (en) | Automated software program repair | |
ElWazeer et al. | Scalable variable and data type detection in a binary rewriter | |
CN101661543B (zh) | 软件源代码安全漏洞的检测方法及检测装置 | |
US10394694B2 (en) | Unexplored branch search in hybrid fuzz testing of software binaries | |
CN103019787B (zh) | 函数调用关系确定方法、热补丁升级方法及装置 | |
CN104636256A (zh) | 一种内存访问异常的检测方法及装置 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
Chen et al. | Coverage prediction for accelerating compiler testing | |
US10902130B2 (en) | Guiding automated testing of binary programs | |
CN110909358A (zh) | 一种基于动静态分析的整形漏洞检测方法 | |
CN104573503A (zh) | 一种内存访问溢出的检测方法及装置 | |
KR101979329B1 (ko) | 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치 | |
CN103745755A (zh) | 一种高效且高可用的空间内存错误检测方法 | |
CN103198260A (zh) | 一种二进制程序漏洞自动化定位方法 | |
CN114201754A (zh) | 一种基于符号抽象分析的智能合约安全审计方法 | |
CN107368742B (zh) | 基于gcc的细粒度虚函数表劫持攻击防御方法 | |
CN110187884B (zh) | 一种多线程应用场景下的访存指令插桩优化方法 | |
US11520682B2 (en) | Code coverage method for embedded system on chip | |
De Goër et al. | Now you see me: Real-time dynamic function call detection | |
CN114510723B (zh) | 一种智能合约权限管理漏洞检测方法及装置 | |
CN114282227B (zh) | 一种Fabric区块链***智能合约的安全分析检测方法 | |
CN112966258B (zh) | 控制流完整性保护方法、***、装置及可读存储介质 | |
Puhan et al. | Program crash analysis based on taint analysis | |
Ding et al. | Identifying buffer overflow vulnerabilities based on binary code | |
US11886589B2 (en) | Process wrapping method for evading anti-analysis of native codes, recording medium and device for performing the method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |