一种基于动态特征的自定义堆管理函数的自动识别方法技术

技术编号:18809834 阅读:32 留言:0更新日期:2018-09-01 09:23
本发明专利技术公开了一种基于动态特征的自定义堆管理函数的自动识别方法,主要包括:1)基于动态执行二进制指令记录进行离线分析,通过call‑ret匹配恢复函数边界信息;2)依次根据堆管理函数的返回值通常是堆指针、处理流程具有相似性、使用情况具有特点的动态特征,对候选函数进行筛选;3)对筛选出的自定义堆管理函数进行去重统计,实现自定义堆管理函数的自动识别。本发明专利技术实现了基于离线动态执行记录分析自动识别自定义的堆管理函数,识别准确性高、分析效率高。

An automatic recognition method of custom heap management function based on dynamic characteristics

The invention discloses an automatic identification method of a self-defined heap management function based on dynamic characteristics, which mainly includes: 1) offline analysis based on dynamic execution of binary instruction records, matching the boundary information of the recovery function through call_ret; 2) the return value of the heap management function in turn is usually a heap pointer, and the processing flow has a heap pointer. Similarity and usage have characteristics of dynamic characteristics, the candidate functions are screened; 3) The selected custom heap management functions are de-recalculated to achieve automatic identification of custom heap management functions. The invention realizes automatic identification of self-defined heap management function based on offline dynamic execution record analysis, and has high identification accuracy and high analysis efficiency.

【技术实现步骤摘要】
一种基于动态特征的自定义堆管理函数的自动识别方法
本专利技术属于软件逆向
,具体涉及一种基于动态特征的自定义堆管理函数的自动识别方法。
技术介绍
基于性能和安全性等考虑,越来越多的程序采用自定义的堆管理函数来分配和管理内存,如Jemalloc、TCmalloc、MMgc等。这些自定义的堆管理函数给程序分析、特别是二进制程序分析带来了新的挑战。例如分析程序存在的堆溢出漏洞(heapoverflow)或释放后重用漏洞(useafterfree)的时候,需要通过堆分配操作(标准系统接口,如malloc等)来确定分配的堆空间大小和时刻,根据堆释放操作(标准系统接口,如free等)来确定堆空间的生存周期。如果存在自定义的堆管理操作,程序会通过标准系统接口向系统申请一大段地址自己管理,堆状态的更新是根据自定义的堆管理函数接口确定的,不会调用标准系统接口,因此在二进制记录中无法发现这些操作,导致无法准确分析程序的运行状态和漏洞情况。目前对自定义的堆管理函数的识别主要依赖于人工分析。基于源代码,分析人员可以通过跟踪内存分配和释放过程的代码,分析是否调用了自定义堆管理函数库;基于二进制程序,分析人员可以通过IDApro等分析工具,对程序进行静态分析,发现其中的自定义堆管理函数。然而这种分析是耗时耗力的,主要依赖于分析人员的经验。阿姆斯特丹自由大学的Herbert等人尝试采用动态执行和特征匹配的方法,实现对堆管理函数进行自动化的识别(WCRE’13)。他们实现了原型系统MemBrush,通过提取堆分配、释放和重分配等操作的行为特征,在动态执行程序的同时测试和检测各项特征,识别堆管理函数。格勒诺布尔阿尔卑斯大学的LaurentMounier等人在USENIXCSET’17上进一步提出了如何评价自定义堆管理函数的识别效果。尽管自定义的堆管理函数识别方法已经取得了一些的研究进展和良好的应用效果,然而现有的方法仍然存在以下的不足:1)在线分析方法效率偏低,同时可能造成分析下的程序执行和正常执行过程不同,缺少基于动态分析记录的离线识别方法;2)之前工作中选取的堆管理函数的动态特征不完整导致识别存在不准确,且有些特征不适用于离线分析过程。
技术实现思路
针对现有技术中存在的技术问题,本专利技术的目的在于提供一种基于动态特征的自定义堆管理函数的自动识别方法,通过动态执行目标程序得到程序执行的二进制指令记录,根据调用栈信息逆向恢复函数边界,根据动态特征信息挑选符合的函数,同时提取函数相关的参数、返回值等信息,实现对自定义堆管理函数的自动识别。一种基于动态特征的自定义堆管理函数的自动识别方法,其步骤如下:1)获取目标程序动态执行过程的二进制指令记录;2)通过call-ret指令配对,恢复二进制指令记录中函数边界信息,得到候选函数;3)根据自定义堆管理函数的动态特征对候选函数进行筛选;4)将筛选出的自定义堆管理函数进行统计去重,实现自定义堆管理函数的自动识别。进一步地,步骤1)中在动态分析环境中执行目标程序来获取目标程序动态执行过程的二进制指令记录。进一步地,所述二进制指令记录包括指令的EIP、相关寄存器(如EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)信息、指令的机器码、记录编号ID。进一步地,步骤2)中所述call-ret指令配对是根据程序通常会采用的call指令调用函数、通过ret指令跳出函数。因此call指令标识函数的开始、ret指令标志着函数结束,通过call-ret指令配对,可以恢复函数边界信息,后续分析基于识别出的候选函数的语义进行筛选。进一步地,步骤2)还包括程序未使用call指令进入函数或ret指令跳出函数的特殊情况。通过分析ret指令之后执行的下一条指令,采用比较ESP的值和EIP指令距离的方法对恢复得到的函数边界进行修正。使call指令的ESP的值小于下一条指令的ESP的值,且ret指令之后执行的下一条指令EIP等于call指令加call指令长度。进一步地,步骤3)中所述动态特征包括返回值特征、处理流程特征和使用情况特征。进一步地,步骤3)中根据返回值特征进行筛选,包括根据获得堆空间的系统接口的调用参数和返回值更新堆状态,筛选出返回值是指向堆空间的指针的函数作为候选函数。进一步地,步骤3)中根据处理流程特征筛选的依据是自定义堆管理函数具有类似的内部处理流程的特征。比如函数根据申请空间的大小不同采用不同的流程(即存在判断申请大小的程序分支);当自定义堆空间不足时会向系统申请空间(即会调用系统接口);分配的堆空间会进行对齐操作(即存在对内存地址的对齐操作);在自定义的管理结构中维护堆状态,并保护该结构的读写一致(即采用互斥操作更新特定结构中的数据)。检测候选函数是否具有上述动态特征,筛选出包含的特征超过设定数量的函数作为下阶段的候选函数。进一步地,步骤3)中根据使用情况进行筛选的依据是自定义堆管理函数在使用过程中存在特征。比如堆管理函数会被调用多次,且每次的返回地址应该不同;返回地址空间应该先写后读;自定义堆管理函数可能对返回地址空间进行初始化操作。检测候选函数是否具有上述动态特征,筛选出包含的特征超过设定数量的函数作为最终的候选函数。进一步地,步骤4)中根据最终筛选出的自定义堆管理函数的入口地址、出口地址进行统计,并去除存在互相调用关系的候选函数中的子函数、保留外层函数。本专利技术的优点和积极效果如下:1、本专利技术实现了基于离线动态执行记录分析自动识别自定义的堆管理函数,尽可能的减少分析过程对执行过程的影响和分析的不确定性,提高了分析的效率。2、本专利技术提出了更多、更具有操作性的自定义堆操作函数的动态特征,借助这些特征可以提高识别的准确性。附图说明图1为基于动态特征的自定义堆管理函数的自动识别方法的流程图。图2为本专利技术获得的二进制执行指令记录示意图。具体实施方式下面结合附图详细说明本专利技术的技术方案:如图1所示,一种基于动态特征的自定义堆管理函数的自动识别方法,包括步骤:1、在动态分析环境中获得目标程序的二进制执行指令记录本专利技术的分析对象是目标程序的动态执行记录,然而并不要求如何获得。以基于QEMU的动态分析系统为例,在QEMU虚拟机中启动目标程序,打开测试样本并进行相关操作(如播放、编辑等),在程序动态执行的同时记录运行的指令,包括记录指令的上下文信息(如指令的EIP、相关寄存器(如EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)的内容、指令的汇编表示、指令的操作数、记录编号ID等),如图2所示。2、通过call-ret指令配对恢复函数边界信息分析二进制指令记录。通过call指令和ret指令恢复函数边界信息,维护一个影子栈记录函数调用情况。遇到call指令入栈,记录call指令的ID、EIP、ESP信息;遇到ret指令出栈,记录ret指令的ID、EIP、ESP信息。对call-ret指令进行匹配的过程中,考虑到实际程序中call指令和ret指令存在不完全匹配出现的情况(如jmp进入被调用函数),采用比较ESP的值和EIP指令距离的方法对识别的函数边界进行修正:分析ret指令的下一条指令,判断NextESP是否大于等于对应call指令的ESP,NextEIP是否满足对应call指令的EIP本文档来自技高网
...

【技术保护点】
1.一种基于动态特征的自定义堆管理函数的自动识别方法,其步骤如下:1)获取目标程序动态执行过程的二进制指令记录;2)通过call‑ret指令配对,恢复二进制指令记录中函数边界信息,得到候选函数;3)根据自定义堆管理函数的动态特征对候选函数进行筛选;4)将筛选出的自定义堆管理函数进行统计去重,实现自定义堆管理函数的自动识别。

【技术特征摘要】
1.一种基于动态特征的自定义堆管理函数的自动识别方法,其步骤如下:1)获取目标程序动态执行过程的二进制指令记录;2)通过call-ret指令配对,恢复二进制指令记录中函数边界信息,得到候选函数;3)根据自定义堆管理函数的动态特征对候选函数进行筛选;4)将筛选出的自定义堆管理函数进行统计去重,实现自定义堆管理函数的自动识别。2.如权利要求1所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述二进制指令记录包括指令的EIP、相关寄存器信息、指令的机器码、记录编号ID。3.如权利要求2所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述寄存器包括EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。4.如权利要求3所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,步骤2)还包括分析ret指令之后执行的下一条指令,采用比较ESP的值和EIP指令距离的方法对恢复得到的函数边界进行修正。5.如权利要求4所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,通过使call指令的ESP的值小于下一条指令的ESP的值,且ret指令之后执行的下一条指令EIP等于call指令加call指令长度对恢复得到的函数边界进行修正。6.如权利要求1所述的基于动态特征的自定义堆管理函数的自...

【专利技术属性】
技术研发人员:贾相堃张超苏璞睿杨轶和亮闫佳
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1