专利名称:一种基于重放分析的网络协议软件状态变量识别方法
专利类型:发明专利
专利申请号:CN202210428951.3
专利申请(专利权)人:中国人民解放军国防科技大学
权利人地址:湖南省长沙市开福区砚瓦池正街47号
专利发明(设计)人:喻波,黄见欣,苏金树,刘润昊,卢建君,杨强
专利摘要:本发明公开了一种基于重放分析的网络协议软件状态变量识别方法,其步骤包括:S1:利用现有虚拟化环境,记录协议软件服务端与客户端的会话过程;S2:通过重放协议软件的会话过程,根据报文的接收和发送过程,定义多次会话交互的报文处理代码,区分协议的不同运行状态;S3:监控内存空间状态变化,并结合进程地址空间的映射关系,识别堆的分配、释放和对内存中可写区域的关联操作,确定程序变量的全生命周期,获得变量的“定义‑使用”链;S4:根据时间序列、寻址方式和“定义‑使用”链的特征构建知识库,通过匹配和筛选的方法,对变量类型及其是否具有状态性进行判定;S5:输出该程序的状态变量。本发明具有原理简单、适用范围广、精度高等优点。
主权利要求:
1.一种基于重放分析的网络协议软件状态变量识别方法,其特征在于,步骤包括:
步骤S1:利用现有的虚拟化环境,记录网络协议软件服务端与客户端的会话过程;
步骤S2:通过重放网络协议软件的会话过程,根据报文的接收和发送过程,定义多次会话交互的报文处理代码,区分协议的不同运行状态;
步骤S3:监控内存空间的状态变化,并结合进程地址空间的映射关系,识别堆的分配、释放和对内存中可写区域的关联操作,确定程序变量的全生命周期,获得变量的“定义‑使用”链;
步骤S4:根据时间序列、寻址方式和“定义‑使用”链这三个维度的特征构建知识库,通过匹配和筛选的方法,对变量的类型及其是否具有状态性进行判定;
步骤S5:输出该网络协议软件的状态变量;
在步骤S2中,利用快照重放复现程序执行的会话交互过程,在解析指令语义的基础上,运用重放分和动态插桩的方法,在服务端与客户端通过系统调用处理数据报文时,插入探针代码,捕获交互的数据、数据存储的位置,记录相应的状态迁移的时间节点和当前数据报文所处会话的位序;
在步骤S3中,于重放记录的过程中关注协议进程地址空间的变化情况;运用动态插桩的方法,监控程序对内存堆区域的分配和释放;并持续跟踪内存读写事件对堆、未初始化数据段、数据段空间的操作,记录程序变量在整个生命周期内的演化过程,输出变量的“定义‑使用”链;
在步骤S4中包括基于时间序列判定,将步骤S3记录变量生命周期的时间戳,即分配空间、释放空间的时间,与步骤S2得到的网络协议软件状态迁移的重要时间节点进行比对判定;
在步骤S4中包括基于寻址方式的判定,将步骤S3中记录的内存读写事件,结合变量所在地址空间的首地址和分配的空间大小,进行结构体变量状态性的判定;若某一位置的若干个结构体变量,其读写操作发生在程序执行过程中的一个时间间隔中,判定这些变量之间具有一定关联性;
在步骤S4中包括基于“定义‑使用”链的判定,将步骤S3中获得的“定义‑使用”链数据结构,包含了变量的一次“定义”,以及对它的全部“使用”的集合,对“定义‑使用”链进行操作语义分析,判定变量是否具有状态特征。
2.根据权利要求1所述的基于重放分析的网络协议软件状态变量识别方法,其特征在于,在步骤S1中,通过软件虚拟化技术,在Panda虚拟化平台中启动网络协议软件服务端与客户端,二者之间进行若干次正常的会话交互;在此过程中,Panda虚拟化平台将网络协议软件运行时产生的握手协商、报文收发、数据处理、系统调用行为完整地记录下来,生成此次运行的快照和日志文件,供后续重放使用。
3.根据权利要求1所述的基于重放分析的网络协议软件状态变量识别方法,其特征在于,所述步骤S3的过程中包括:堆变量:在系统调用层面,堆变量通过malloc申请、和/或通过free释放、和/或通过mem_read/mem_write来完成读写操作;对malloc、calloc、realloc、free、read、write系统调用安装钩子,实现调用时的动态插桩,完成分析功能;
BSS段变量:通过程序加载时的虚拟地址空间映射关系,找到BSS段的起始地址和空间分配情况,针对其中特定地址的读写操作进行监控,完成动态插桩分析;
数据段变量:在状态变量识别的过程中,不作考量;
Linux操作系统中,数据段和BSS合并在一起统称数据段,以上BSS段变量和数据段变量的内容也相应合并处理。
4.根据权利要求1所述的基于重放分析的网络协议软件状态变量识别方法,其特征在于,所述基于时间序列判定的过程包括:若某一变量的生命周期,自程序运行起始,至程序结束终止,则判定为全局变量,具有状态特征;
若某一变量的生命周期,自程序与另一网络客体握手通信时起始,至通信结束终止,则该变量较大可能维护着与通信客体相关的信息,具有状态特征;
若某一变量的生命周期,处于协议会话的消息一次交互过程中,自程序接收到数据报文起始,至发出响应报文终止,则认定该变量的用途仅限于处理单次会话消息,其不具备状态特征;而当变量的生命周期跨越多次消息交互的时间段时,其在前一次会话中的取值可能会对后一次会话中的使用造成影响,因而具有状态特征。
5.根据权利要求1所述的基于重放分析的网络协议软件状态变量识别方法,其特征在于,所述基于“定义‑使用”链判定的过程包括:对于单个变量,在不具关联变量的情况下,若其“定义‑使用”集中在一个代码基本块内,则判定其不具有状态特征;若其“定义‑使用”跨越了多个代码基本块,则考虑对该变量的读写操作次序,当其中含有跨越基本块的“先写后读”时,判定其具有状态特征;
对于多个具有关联性的变量,对比分析程序对这些变量进行的读写操作,若存在同时分配、同时使用、同时释放的情况,则判定所述多个具有关联性的变量具有状态特征。 说明书 : 一种基于重放分析的网络协议软件状态变量识别方法技术领域[0001] 本发明主要涉及到软件分析技术领域,特指一种基于重放分析的网络协议软件状态变量识别方法。背景技术[0002] 动态分析是软件分析与漏洞挖掘领域一种常用的自动化分析技术,其方法是将软件在硬件环境或模拟器环境中执行,并利用执行环境的分析工具,监控代码的所有操作,观察代码执行流程及状态,获取执行过程中的各种数据。动态分析的优势在于能够获取程序执行过程中的细粒度状态,甚至能够获取函数调用的具体参数信息、指令中各个操作数的具体值,提供比静态分析更充足的分析数据。[0003] 为了针对程序的某类功能或某些行为进行深入地分析,在程序动态分析过程中通常会使用虚拟化平台,对其执行流程进行记录并重放,这样既可以固化地保存分析环境,提高工作效率,同时还能够在不影响程序执行流的情况下动态捕获程序内存、CPU等关键数据。[0004] 网络协议软件,尤其是部署到嵌入式系统中的网络协议软件,其运行状态和异常难以捕获,例如嵌入式系统和物联网固件中的网络协议软件发生崩溃时,需要基于全系统模拟环境并通过插桩技术才能发现。插桩技术是通过在目标程序中插入“探针”代码,并通过对这些“探针”的执行监控和记录程序运行时的执行流、数据流等特征信息,从而在运行时获得执行反馈信息来进行下一步的深入分析。[0005] 网络协议在运行功能并提供服务的过程中,需要通过多个回合的消息交互,并且消息报文之间存在一定的逻辑递进或因果关系;从服务端的角度,需要维护和记录多个用户的消息交互状态,这样的协议称为有状态的网络协议。网络协议软件在实现的过程中,为了维护通信实体特征、存储会话参数、标识状态信息等,通常会在程序里设置若干全局变量或共享变量。协议软件的运行状态,不仅仅受当前用户输入的影响,也跟这些全局变量或共享变量中维护的即时会话状态、参数配置密切相关。而伴随着协议状态的转换,这些变量自身的取值也随之发生变化,在程序运行过程中呈现出较为明显的状态特性,称之为协议程序的有状态变量。[0006] 当出现多个会话交互的情况下,程序的执行路径可能会多次进入某些具有特定功能的代码块,如果对其中含有状态的关键变量处理不当,就会出现逻辑混淆,进而导致协议状态错误、程序异常。目前针对这类问题的解决缺乏有效方法,对于普通二进制程序变量逻辑错误的描述与度量方法,应用到网络协议软件上的还比较有限,没有针对协议状态的有效分析方法,不能够在协议会话的多次交互过程中,对状态相关变量进行发现和检测。而传统的漏洞挖掘技术,例如模糊测试,主要侧重基于路径覆盖的探索分析,应用到网络协议软件上,受到网络协议会话状态的限制,往往无法快速定位并识别存在问题的状态变量。本发明所实现的方法,能够辅助模糊测试更有效地发现和定位潜在的脆弱点,有利于漏洞根源的自动分析和漏洞的可利用性分析。[0007] 从实际应用的角度来看,为了检测协议软件在通信过程中由于多次会话交互或记录多个客户端信息而导致的状态异常,需要对协议软件进行记录重放,自动跟踪报文接收过程,定位报文处理代码。在接下来的分析过程中,一是需要监控报文处理代码中内存空间分配、使用、释放等动作,识别多次交互过程中使用的共享变量或全局参数,二是构建程序在多次交互的不同执行路径中的状态变量生成、引用、传递和回收的全生命周期状态,并检测状态变量是否存在脆弱性。发明内容[0008] 本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种原理简单、适用范围广、精度高的基于重放分析的网络协议软件状态变量识别方法。[0009] 为解决上述技术问题,本发明采用以下技术方案:[0010] 一种基于重放分析的网络协议软件状态变量识别方法,其步骤包括:[0011] 步骤S1:利用现有的虚拟化环境,记录协议软件服务端与客户端的会话过程;[0012] 步骤S2:通过重放协议软件的会话过程,根据报文的接收和发送过程,定义多次会话交互的报文处理代码,区分协议的不同运行状态;[0013] 步骤S3:监控内存空间的状态变化,并结合进程地址空间的映射关系,识别堆的分配、释放和对内存中可写区域的关联操作,确定程序变量的全生命周期,获得变量的“定义‑使用”链;[0014] 步骤S4:根据时间序列、寻址方式和“定义‑使用”链这三个维度的特征构建知识库,通过匹配和筛选的方法,对变量的类型及其是否具有状态性进行判定;[0015] 步骤S5:输出该程序的状态变量。[0016] 作为本发明方法的进一步改进:在步骤S1中,通过软件虚拟化技术,在Panda虚拟化平台中启动协议软件服务端与客户端,二者之间进行若干次正常的会话交互;在此过程中,Panda虚拟化平台将程序运行时产生的握手协商、报文收发、数据处理、系统调用行为完整地记录下来,生成此次运行的快照和日志文件,供后续重放使用。[0017] 作为本发明方法的进一步改进:在步骤S2中,利用快照重放复现程序执行的会话交互过程,在解析指令语义的基础上,运用重放分和动态插桩的方法,在服务端与客户端通过系统调用处理数据报文时,插入探针代码,捕获交互的数据、数据存储的位置,记录相应的状态迁移的时间节点和当前数据报文所处会话的位序。[0018] 作为本发明方法的进一步改进:在步骤S3中,于重放记录的过程中关注协议进程地址空间的变化情况;运用动态插桩的方法,监控程序对内存堆区域的分配和释放;并持续跟踪内存读写事件对堆、未初始化数据段、数据段空间的操作,记录程序变量在整个生命周期内的演化过程,输出变量的“定义‑使用”链。[0019] 作为本发明方法的进一步改进:所述步骤S3的过程中包括:[0020] 堆变量:在系统调用层面,堆变量通过malloc申请、和/或通过free释放、和/或通过mem_read/mem_write来完成读写操作;对malloc、calloc、realloc、free、read、write系统调用安装钩子,实现调用时的动态插桩,完成分析功能;[0021] BSS段变量:通过程序加载时的虚拟地址空间映射关系,找到BSS段的起始地址和空间分配情况,针对其中特定地址的读写操作进行监控,完成动态插桩分析;[0022] 数据段变量:在状态变量识别的过程中,不作考量;[0023] Linux操作系统中,数据段和BSS合并在一起统称数据段,以上BSS段变量和数据段变量的内容也相应合并处理。[0024] 作为本发明方法的进一步改进:在步骤S4中包括基于时间序列判定,将步骤S3记录变量生命周期的时间戳,即分配空间、释放空间的时间,与步骤S2得到的协议软件状态迁移的重要时间节点进行比对判定。[0025] 作为本发明方法的进一步改进:所述基于时间序列判定的过程包括:[0026] 若某一变量的生命周期,自程序运行起始,至程序结束终止,则判定为全局变量,具有状态特征;[0027] 若某一变量的生命周期,自程序与另一网络客体握手通信时起始,至通信结束终止,则该变量较大可能维护着与通信客体相关的信息,具有状态特征;[0028] 若某一变量的生命周期,处于协议会话的消息一次交互过程中,自程序接收到数据报文起始,至发出响应报文终止,则认定该变量的用途仅限于处理单次会话消息,其不具备状态特征;而当变量的生命周期跨越多次消息交互的时间段时,其在前一次会话中的取值可能会对后一次会话中的使用造成影响,因而具有状态特征。[0029] 作为本发明方法的进一步改进:在步骤S4中包括基于寻址方式的判定,将步骤S3中记录的内存读写事件,结合变量所在地址空间的首地址和分配的空间大小,进行结构体变量状态性的判定;若某一位置的若干个结构体变量,其读写操作发生在程序执行过程中的一个时间间隔中,判定这些变量之间具有一定关联性。[0030] 作为本发明方法的进一步改进:在步骤S4中包括基于“定义‑使用”链的判定,将步骤S3中获得的“定义‑使用”链数据结构,包含了变量的一次“定义”,以及对它的全部“使用”的集合,对“定义‑使用”链进行操作语义分析,判定变量是否具有状态特征。[0031] 作为本发明方法的进一步改进:所述基于“定义‑使用”链判定的过程包括:[0032] 对于单个变量,在不具关联变量的情况下,若其“定义‑使用”集中在一个代码基本块内,则判定其不具有状态特征;若其“定义‑使用”跨越了多个代码基本块,则考虑对该变量的读写操作次序,当其中含有跨越基本块的“先写后读”时,判定其具有状态特征;[0033] 对于多个具有关联性的变量,对比分析程序对这些变量进行的读写操作,若存在同时分配、同时使用、同时释放的情况,则判定该组若干个关联性的变量具有状态特征。[0034] 与现有技术相比,本发明的优点就在于:[0035] 本发明的基于重放分析的网络协议软件状态变量识别方法,主要是针对网络协议软件,针对现有程序分析技术在网络协议软件的状态变量检测和漏洞挖掘方面的不足,所提出的基于重放分析的动态程序分析方法,本发明原理简单、适用范围广、精度高,其能够发现其内部对于有状态变量的使用方式,进行状态变量的识别,可用于辅助进行漏洞分析,在实际应用中非常有效。附图说明[0036] 图1是本发明方法的流程示意图。[0037] 图2是本发明在具体应用实例中的流程示意图。具体实施方式[0038] 以下将结合说明书附图和具体实施例对本发明做进一步详细说明。[0039] 如图1所示,本发明的一种基于重放分析的网络协议软件状态变量识别方法,其步骤包括:[0040] 步骤S1:利用现有的虚拟化环境,记录协议软件服务端与客户端的会话过程。[0041] 步骤S2:通过重放协议软件的会话过程,根据报文的接收和发送过程,定义多次会话交互的报文处理代码,区分协议的不同运行状态。[0042] 步骤S3:监控内存空间的状态变化,并结合进程地址空间的映射关系,识别堆的分配、释放和对内存中可写区域的关联操作,确定程序变量的全生命周期,获得变量的“定义‑使用”链。[0043] 步骤S4:根据时间序列、寻址方式和“定义‑使用”链这三个维度的特征构建知识库,通过匹配和筛选的方法,对变量的类型及其是否具有状态性进行判定。[0044] 步骤S5:输出该程序的状态变量。[0045] 在具体应用实例中,在步骤S1中,本发明通过软件虚拟化技术,可以利用现有平台实现对物理资源访问的截获和模拟。[0046] 其中,典型的开源虚拟化平台是QEMU,Panda则是基于QEMU扩展的虚拟化分析平台,可以通过自身的指令翻译模块来模拟程序执行,并且具有重放功能。选择Panda作为协议软件的基础运行平台,能够在轻量级负载条件下运行系统内的程序,然后在重放过程中添加多层次的监控逻辑。[0047] 因此,在具体应用时,在Panda虚拟化平台中启动协议软件服务端与客户端,二者之间进行若干次正常的会话交互。在此过程中,Panda会将程序运行时产生的握手协商、报文收发、数据处理、系统调用等行为完整地记录下来,生成此次运行的快照和日志文件,供后续重放使用。[0048] 在具体应用实例中,在步骤S2中,将第一步得到的快照重放,复现程序执行的会话交互过程。在此过程中,程序的运行状态会随着会话数据的输入和输出发生转移变迁。也就是说,程序在接收和发送数据报文时,往往对应着程序甚至协议的状态转换。[0049] 基于协议软件的这个特点,本发明在解析指令语义的基础上,运用重放分和动态插桩的方法,在服务端与客户端通过系统调用处理数据报文时,插入探针代码,捕获交互的数据、数据存储的位置,记录相应的状态迁移的时间节点和当前数据报文所处会话的位序。[0050] 在具体应用实例中,在步骤S3中,于所述步骤S2的重放记录的过程中,关注协议进程地址空间的变化情况。运用动态插桩的方法,监控程序对内存堆区域的分配和释放;并持续跟踪内存读写事件对堆、未初始化数据段(BSS,BlockStartedbySymbol)、数据段等空间的操作,记录程序变量在整个生命周期内的演化过程,输出变量的“定义‑使用”链。[0051] 在具体应用时,所述步骤S3的过程可以包括:[0052] 堆变量:堆(Heap)是一块可用于动态分配的虚拟内存空间。在系统调用层面,堆变量通过malloc(类似的还包括calloc和realloc)申请、通过free释放、通过mem_read/mem_write来完成读写操作。因此,对malloc、calloc、realloc、free、read、write等系统调用安装钩子,实现调用时的动态插桩,完成分析功能。[0053] BSS段变量:在可执行文件的虚拟地址空间中,BSS段(.data)通常用来存放未初始化的全局变量和局部静态变量。BSS段属于静态内存分配,且未初始化变量的值通常为0,在初始化时才会被真正赋值。因此,可以通过程序加载时的虚拟地址空间映射关系,找到BSS段的起始地址和空间分配情况。再针对其中特定地址的读写操作进行监控,完成动态插桩分析。[0054] 数据段变量:数据段(.data)保存的是已经初始化的全局静态变量和局部静态变量。这两类变量在处理和使用上与常量或只读变量相似,通常不会产生状态混淆。在状态变量识别的过程中,可以不作考量。[0055] Linux操作系统中,数据段和BSS合并在一起统称数据段,以上BSS段变量和数据段变量的内容也相应合并处理。[0056] 在具体应用实例中,在步骤S4中包括:[0057] 基于时间序列判定:由于程序中设置的全局变量或共享变量的生命周期贯穿整个程序的执行过程,这些变量负责维护协议运行过程中的即时会话状态、参数配置、客体信息等关键信息,并随着程序的执行、状态的变迁而改变。基于这一特点,将步骤S3记录变量生命周期的时间戳,即分配空间、释放空间的时间,与步骤S2得到的协议软件状态迁移的重要时间节点进行比对判定。[0058] 若某一变量的生命周期,自程序运行起始,至程序结束终止,则判定为全局变量,具有状态特征。[0059] 若某一变量的生命周期,自程序与另一网络客体握手通信时起始,至通信结束终止,则该变量较大可能维护着与通信客体相关的信息,具有状态特征。[0060] 若某一变量的生命周期,处于协议会话的消息一次交互过程中,自程序接收到数据报文起始,至发出响应报文终止,则认定该变量的用途仅限于处理单次会话消息,其不具备状态特征。而当变量的生命周期跨越多次消息交互的时间段时,其在前一次会话中的取值可能会对后一次会话中的使用造成影响,因而具有状态特征。[0061] 基于寻址方式的判定:在协议程序中,与协议状态、会话、通信参数、加密套件等信息通常会以结构体的方式进行保存。该类数据结构在访问时,往往是以基址(内存块首地址)+变址(偏移)的方式进行。针对这一特点,将步骤S3中记录的内存读写事件,结合变量所在地址空间的首地址和分配的空间大小,进行结构体变量状态性的判定。[0062] 若某次内存读写事件的位置(地址+长度),位于某一块已经分配的堆空间内,则记录其与首地址的偏移,判定其为结构体变量。[0063] 若某一位置的若干个结构体变量,其读写操作发生在程序执行过程中的某一段极小时间间隔中,判定这些变量之间具有一定关联性。[0064] 基于“定义‑使用”链的判定:步骤S3中获得的“定义‑使用”链数据结构,包含了变量的一次“定义”,以及对它的全部“使用”的集合。其中能够反映程序对变量的一系列操作是否符合安全性要求。基于这一特点,对“定义‑使用”链进行操作语义分析,判定变量是否具有状态特征。[0065] 对于单个变量,在不具关联变量的情况下,若其“定义‑使用”集中在一个代码基本块内,则判定其不具有状态特征;若其“定义‑使用”跨越了多个代码基本块,则考虑对该变量的读写操作次序,当其中含有跨越基本块的“先写后读”时,判定其具有状态特征。[0066] 对于多个具有关联性的变量,对比分析程序对这些变量进行的读写操作,若存在同时分配、同时使用、同时释放的情况,则判定该组若干个关联性的变量具有状态特征。[0067] 在具体应用实例中,在步骤S5中,经过步骤S4判定筛选,得到一系列状态变量的集合,将其在虚拟地址空间的首地址和长度,以json格式输出。[0068] SSL是SecureSocketsLayer(安全套接层协议)的缩写,工作在可靠的传输层协议(TCP)之上,OpenSSL是一个开源的SSL协议软件。为使本发明的目的、内容、和优点更加清晰,在一个具体应用实例中,参见图2,本发明以这款协议软件为例,对本发明的具体实施方式作进一步详细描述。[0069] 在本发明的实现过程中,需要用到虚拟化环境Panda、反汇编工具Capstone和Python运行环境。以下对本发明如何基于重放分析的方法进行状态变量的识别和分析进行说明。[0070] 步骤S1:利用现有的虚拟化环境,记录协议软件服务端与客户端的会话过程。[0071] (1)搭建虚拟化平台,准备待测试的软件;[0072] 在VMwareWorkstation中安装Ubuntu虚拟机,进而安装Panda环境;或者通过Docker从互联网上直接拉取pandare的镜像,均可实现虚拟化平台的搭建。[0073] OpenSSL协议软件的获取可以通过其官方网站(https://www.openssl.org/)下载源码,然后进行编译安装。测试的客户端程序为python实现的正常会话发起程序,具有完成协议握手并建立会话连接的功能。[0074] 步骤S2:运行测试软件,记录执行过程;[0075] 将(1)中编译完成的OpenSSL二进制程序和测试客户端程序复制到Panda的镜像中,通过panda的run_serial_cmd开始进行测试和记录。程序运行完毕后,再通过panda的run_monitor_cmd停止记录。此时,会在当前工作目录下生成与本次执行过程相关的*.recording‑rr‑snp和*.log两个文件。[0076] 步骤S2:通过重放协议软件的会话过程,根据报文的接收和发送过程,定义多次会话交互的报文处理代码,区分协议的不同运行状态。[0077] 通过panda的run_replay将第一步中得到的*.recording‑rr‑snp进行重放,重放过程中将再现协议软件加载启动,并与客户端进行通信的整个过程。[0078] 由于SSL是工作在TCP协议之上,因此OpenSSL在发送和接收数据报文的过程中会分别使用write和read的系统调用。基于此特征,在OpenSSL程序从write和read的调用返回时,即对on_sys_write_return、on_sys_read_return的事件作动态插桩,在事件响应的过程中加入专门的处理逻辑,记录事件发生的时间戳以及当前数据报文的存储位置、大小、时序编号。[0079] 步骤S3:监控内存空间的状态变化,并结合进程地址空间的映射关系,识别堆的分配、释放和对内存中可写区域的关联操作,确定程序变量的全生命周期,获得变量的“定义‑使用”链。[0080] (1)建立进程类和相关的数据结构;[0081] 实现此步骤,需要先建立进程相关的类和数据结构,该结构保存了进程名、进程ID、起始时间、父进程、子进程、地址映射关系等信息。建立完成后,就可以在Panda的系统级重放过程中,针对OpenSSL进程及其相关的线程展开分析。[0082] (2)分析进程的虚拟地址空间;[0083] 通过OpenSSL协议软件的进程名,得到相应的pid和asid,进而获得进程虚拟地址空间中数据段、代码段、堆、栈各个区域的地址映射关系,并将各个区域的地址范围记录保存。[0084] (3)监控虚拟地址空间中的分配、释放操作;[0085] (3.1)空间分配:对malloc、calloc、realloc事件挂载钩子,加入分析代码,获取当前的程序pc、分配函数返回的地址和大小。在malloc等函数返回之后,判断其是否属于堆或BSS数据段的范围。若处在有效的范围内,则记录该次分配操作的时间戳,更新当前块的使用信息。[0086] (3.2)空间释放:对free事件挂载钩子,加入分析代码,记录当前的程序pc、释放空间的首地址和大小。随后判断其是否属于堆或BSS数据段的范围。若处在有效的范围内,则记录该次释放操作的时间戳,更新当前块的使用信息。[0087] (4)跟踪内存读写事件对堆、未初始化数据段(BSS,BlockStartedbySymbol)、数据段等空间的操作。[0088] 对libc的read、write事件挂载钩子,加入分析代码,记录当前的程序pc、读或写操作对象的地址和大小、该次操作的时间戳,更新当前块的使用信息,从而形成程序变量在整个生命周期内的演化过程。[0089] (5)输出变量的“定义‑使用”链。[0090] 步骤S4:根据时间序列、寻址方式和“定义‑使用”链这三个维度的特征构建知识库,通过匹配和筛选的方法,对变量的类型及其是否具有状态性进行判定。[0091] (1)建立分析规则;[0092] 如发明内容中的第四步所述,将时间序列、寻址方式和“定义‑使用”链三个维度所定义的规则进行工程实现,对应封装成可供调用的函数。[0093] (2)实现分析算法;[0094] 如本发明中的步骤所述,对所述步骤S3中得到的每个内存块,依据时间序列、寻址方式和“定义‑使用”链三个维度的规则进行分析评估。方法如下:[0095] (2.1)时间序列:遍历当前发现的内存块记录,其分配空间、释放空间的时间戳间隔,若大于一次数据报文交互的时间,则将该内存块作为候选的状态变量,转入下一步分析;若小于等于一次数据报文交互的时间,则不再对该内存块进行分析。[0096] (2.2)寻址方式:遍历当前发现的内存块记录,若某个已经分配空间的堆块内,存在内存读写事件的记录(地址+长度),则分析计算其与首地址的偏移,标记为结构体变量。若分析得到的若干个结构体变量,其读写操作发生在程序执行过程中的某一段极小时间间隔中,则标记这些变量之间具有一定关联性。[0097] (2.3)“定义‑使用”链分析:分为两个阶段。[0098] 首先,针对单一变量,即(2.2)中未标记关联性的变量,若其“定义‑使用”集中在一个代码基本块内,则不再对该内存块进行状态性分析;若其“定义‑使用”跨越了多个代码基本块,则考察对该变量的读写操作次序,其中含有跨越基本块的“先写后读”时,标记其具有状态特征。[0099] 然后,针对多个具有关联性的变量,对比分析程序对这些变量进行的读写操作,是否存在同时分配、同时使用、同时释放的情况。若是,则将该组内具有关联性的变量都标记为具有状态特征。[0100] 步骤S5:输出该程序的状态变量。[0101] 将步骤S4中发现的状态变量相关信息组织成json形式,输出其在虚拟地址空间的首地址和长度。[0102] 以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
专利地区:湖南
专利申请日期:2022-04-22
专利公开日期:2024-06-18
专利公告号:CN114866300B