CN115129320B - 一种基于循环不变式的间接跳转目标地址识别方法及装置 - Google Patents
一种基于循环不变式的间接跳转目标地址识别方法及装置 Download PDFInfo
- Publication number
- CN115129320B CN115129320B CN202210686923.1A CN202210686923A CN115129320B CN 115129320 B CN115129320 B CN 115129320B CN 202210686923 A CN202210686923 A CN 202210686923A CN 115129320 B CN115129320 B CN 115129320B
- Authority
- CN
- China
- Prior art keywords
- analysis
- statement
- target address
- indirect jump
- pointer
- 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
- 238000000034 method Methods 0.000 title claims abstract description 64
- 238000004458 analytical method Methods 0.000 claims abstract description 159
- 230000014509 gene expression Effects 0.000 claims abstract description 132
- 125000004122 cyclic group Chemical group 0.000 claims abstract description 13
- 101001034831 Homo sapiens Interferon-induced transmembrane protein 5 Proteins 0.000 claims abstract 5
- 102100039731 Interferon-induced transmembrane protein 5 Human genes 0.000 claims abstract 5
- 238000010276 construction Methods 0.000 claims description 20
- 230000009191 jumping Effects 0.000 claims description 11
- 238000004590 computer program Methods 0.000 claims description 10
- 238000012804 iterative process Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 9
- 238000010586 diagram Methods 0.000 description 7
- 230000003068 static effect Effects 0.000 description 5
- 238000004364 calculation method Methods 0.000 description 4
- 238000005206 flow analysis Methods 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000006978 adaptation Effects 0.000 description 2
- 238000013135 deep learning Methods 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000013528 artificial neural network Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- JEIPFZHSYJVQDO-UHFFFAOYSA-N iron(III) oxide Inorganic materials O=[Fe]O[Fe]=O JEIPFZHSYJVQDO-UHFFFAOYSA-N 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
- G06F8/434—Pointers; Aliasing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种基于循环不变式的间接跳转目标地址识别方法及装置。方法包括:将二进制程序解码成中间表示BRIL;根据BRIL语义和控制流结构计算循环不变式,并将其保存到分析树的结点中;深度优先遍历分析树,将循环不变式不断约简合并,生成约束表达式集;对约束表达式集求解,得到间接跳转目标地址;将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行分析树的构建、约束表达式集的生成和求解,直到间接跳转目标地址不再发生变化(不动点)。本发明相比于传统数据流分析的方法,利用循环不变式来增加对地址数据的分析深度,并能够减少对循环结构的分析次数,从而提高间接跳转目标地址识别的准确度和效率。
Description
技术领域
本发明属于二进制程序分析技术领域,具体涉及一种基于循环不变式的间接跳转目标地址识别方法及装置。
技术背景
二进制程序分析是程序分析领域中热点话题之一。尽管越来越多的程序是用解释型编程语言(如Python、JavaScript)编写,但是针对性能要求较高的程序依然是用编译型编程语言(如C/C++、Rust)编写,并且在物联网中大量的设备由于计算资源有限,运行的都是由C语言编写的二进制程序。此外,从安全的角度而言,对源码的分析往往不考虑编译器行为的影响,因此二进制程序中可能会引入源码中不存在的安全问题。
二进制程序分析的首要任务就是反汇编,即识别二进制程序中的代码和数据,从而获取函数之间的调用图(CG)和函数内部的控制流图(CFG),以便进行更高级的程序分析,例如程序理解分析、程序切片分析、程序模型分析等。最直接的反汇编方法就是对二进制程序线性扫描,通过逐条指令解码的方法恢复汇编语句。汇编语句由两部分构成,分别是操作码和操作数,其中操作码表示语句语义,操作数表示操作内容。更精确的反汇编方法是对二进制程序递归扫描,根据语句语义寻找下一条指令的位置并跳转扫描,但是递归扫描面临着一个巨大的挑战,那就是无法准确识别间接跳转的目标地址。
程序的执行顺序遵循着统一的规则。对于非跳转语句,CPU会按照程序地址空间的顺序依次执行;对于直接跳转语句,CPU会按照语句中的操作数寻址并执行;对于间接跳转语句,操作数并不是地址,往往只是表示寄存器的代号。在程序实际运行的过程中,CPU会依据寄存器的代号,取出寄存器中的内容寻址并执行。因此,往往只有在程序实际运行的时候,才能准确识别间接跳转的目标地址。考虑到实际运行程序会有较大的代价(如恶意代码、物理设备限制等),于是研究者更希望通过静态分析的方法进行二进制程序分析。
国内外关于识别间接跳转目标地址的问题大致可以分为以下几类,基于跳转表匹配的方法、基于数据流分析的方法、基于动静结合分析的方法、基于深度学习的方法等。最开始研究人员考虑只解决switch语句(C语言中表达多分支条件的语句)产生的间接跳转问题,据此提出基于跳转表匹配的间接跳转目标地址识别方法,即根据编译软件(如gcc、clang等)的编译特点,在程序中特定位置匹配跳转表,从而实现目标地址的识别。由于基于跳转表匹配的识别方法具有很大的局限性(如无法识别未知编译器的跳转表等),研究人员考虑通过数据流分析的方法计算出间接跳转的目标地址。然而,对复杂程序的数据流分析代价很大,往往需要通过多次迭代分析才能得到正确的结果。渐渐地,开始有一些研究者尝试利用动静结合分析的方法,来解决数据流分析代价过大的问题,即利用静态分析的结果和程序插桩技术,在程序实际运行时进行监控,把间接跳转的目标地址直接从CPU寄存器中提取出来,从而解决识别间接跳转目标地址的问题。然而,受到物理设备的限制以及基于安全的考虑,运行目标程序是一件困难的事情。随着人工智能和深度神经网络的发展,一些研究人员也在考虑使用深度学习的方法来识别间接跳转的目标地址。
发明内容
目的:本发明针对静态分析无法准确识别间接跳转目标地址的问题,提出一种基于循环不变式的间接跳转目标地址识别方法及装置,结合了数据流分析的思想,利用循环不变式来增加对地址数据的分析深度,并能够减少对循环结构的分析次数,从而提高间接跳转目标地址识别的准确度和效率。
技术方案:为解决上述技术问题,本发明采用的技术方案为:
第一方面,提供一种间接跳转目标地址识别方法,包括:
将二进制程序解码成汇编语句,转换成中间表示BRIL;
根据BRIL语义和控制流结构计算并更新λ表达式,得到循环不变式,将循环不变式保存到分析树的结点中;
将约束表达式置空,从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集;
对约束表达式集迭代求解,直到间接跳转目标地址不再发生变化,得到识别出的间接跳转目标地址。
本发明包括对控制流计算循环不变式、对分析树生成约束表达式集、对约束表达式集迭代求解三个部分,其中:
对控制流循环不变式的计算,是指根据定值语句的语义和控制流结构计算λ表达式的过程。首先定值语句根据其语义可以分为常定值和自定值,分别对应不同形式的λ表达式,然后根据控制流结构计算并更新λ表达式,得到循环不变式。
对分析树约束表达式集的生成,是指深度优先遍历分析树,将循环不变式不断约简合并,生成λ表达式集合的过程。首先从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,然后由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集。
对约束表达式集的迭代求解,是指将初始值输入约束表达式集,计算出间接跳转目标地址,然后将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行分析树的构建、约束表达式集的生成和求解,直到间接跳转目标地址不再发生变化(不动点)。
在一些实施例中,根据BRIL语义和控制流结构计算并更新λ表达式,得到循环不变式,将循环不变式保存到分析树的结点中,包括:
初始化循环不变式中的自由变量K索引为0,建立只有根节点的分析树,并将分析指针指向此结点;
从分析入口开始,按照控制流遍历程序,不断更新分析树、指针表和K索引;
当遍历终止时,在分析树结点中保存的就是控制流循环不变式。
进一步地,在一些实施例中,分析树、指针表和K索引的更新方法,包括:
对于无条件跳转语句,分析树和K索引保持不变;将语句地址和分析指针保存到指针表,跳转到操作数指向的语句,重新进行分析树的构建方法;
对于条件跳转语句,分析树和K索引保持不变;将语句地址和分析指针保存到指针表;跳转到操作数指向的语句或者顺序执行的下一条语句,重新进行分析树的构建方法,并缓存此时语句的选择和指针表;
对于定值语句,K索引保持不变;如果语句地址不在指针表中,那么就在分析指针指向结点的空子树处,创建新的结点,并在结点中保存根据语句语义计算的λ表达式,将分析指针指向此结点,并保存语句地址和分析指针到指针表;如果语句地址在指针表中,进行λ表达式的更新替换操作;
对于间接跳转语句,分析树保持不变,K索引增加1;从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态,跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空;
对于终止语句,分析树和K索引保持不变;从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态,跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空。
进一步地,λ表达式更新替换方法,包括:
步骤1)将语句地址对应的分析指针从指针表中取出;
步骤2)如果分析指针指向的结点不是循环不变式结点,更新替换其中保存的λ表达式,并将此结点标记为循环不变式结点;
步骤2.1)对于自定值语句,更新替换方法是将λ表达式中的常数项乘以Ki,其中i是K索引;
步骤2.2)对于非自定值语句,更新替换前后的λ表达式形式相同;
步骤3)如果分析指针指向的结点是循环不变式结点,从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态;跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空。
在一些实施例中,将循环不变式不断约简合并,包括:
当约束表达式为空时,约简的λ表达式就是合并结果;
当约束表达式不为空时,将约束表达式的自由变量替换成λ表达式,然后对约束表达式进行约简,得到合并结果。
在一些实施例中,对约束表达式集迭代求解方法,包括:
步骤1)将初始值输入约束表达式集,计算出间接跳转目标地址;如果约束表达式无法求出间接跳转目标地址,则舍弃此约束表达式;
步骤2)将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行分析树的构建、约束表达式集的生成和求解,直到间接跳转目标地址不再发生变化(不动点);
步骤3)在迭代过程中得到的所有结果,就是识别出的间接跳转目标地址。
进一步地,计算出间接跳转目标地址,包括:
步骤1)如果约束表达式不包含Ki,其中i是K索引,将“跳转”变量替换成初始值之后,再进行数学运算,得到间接跳转目标地址;
步骤2)如果约束表达式包含Ki,其中i是K索引,将“跳转”变量替换成初始值之后,再对Ki合理取值和数学运算,得到间接跳转目标地址;其中Ki的取值是从0开始的整数,同一个约束表达式中的Ki不能同时为0,并要确保间接跳转目标地址在有效范围内。
第二方面,本发明提供了一种间接跳转目标地址识别装置,包括处理器及存储介质;
所述存储介质用于存储指令;
所述处理器用于根据所述指令进行操作以执行根据第一方面所述方法的步骤。
第三方面,本发明提供了一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面所述方法的步骤。
有益效果:
一、本发明将循环不变式作为程序分析的终止条件之一,缓解了有限深度分析方法中路径爆炸的问题。在有限深度分析方法中,为了增加数据流分析的精度,往往会增加对循环结构的分析深度,从而导致分析的复杂度大大增加。本发明提出的方法实现了每条指令最多3次的分析,减少了对循环结构的分析次数。
例如本发明的示例程序,使用有限深度分析的方法,在分析深度为3时,有4条分析路径,共29步求出间接跳转目标地址,而本发明的提出的方法仅需要15步。
二、本发明利用自由变量K来增加对地址数据的分析深度,相比于有限深度分析的方法,在一定程度上提高了分析的准确度。在有限深度分析方法中,往往会丢失超过分析深度的地址数据,而本发明提出的方法可以描述任意深度地址数据的变化规律,从而增加了分析的准确度。
例如本发明的示例程序,使用有限深度分析的方法,当迭代深度为1时,识别出的间接跳转目标地址有0x5和0x7,而本发明识别出的间接跳转目标地址有0x0、0x5和0x7,其中地址0x0是迭代深度为2以上时,才能识别出的间接跳转目标地址。
三、本发明利用函数(λ表达式)来抽象解释二进制程序,相比于传统数据流分析的方法,在一定程度上提高了迭代分析的效率。在传统数据流分析方法中,当数据流值发生变化时,往往需要多次分析程序来达到迭代不动点。然而,本发明提出的方法利用函数参数传递的特点,在迭代求解的过程中,通过将不同的初始值直接代入函数,来提高迭代分析的效率。
例如本发明的示例程序,使用传统数据流分析的方法,在以地址0x0为初始值迭代时,需要从头分析程序;然而,在以本发明提出方法迭代的时候,由于地址0x0在指针表中,因此可以复用约束表达式集,直接将0x0作为初始值代入约束表达式集,达到迭代不动点,分析终止。
附图说明
图1是基于循环不变式的间接跳转地址识别方法整体流程图。
图2是示例程序的控制流图(CGF)。
图3是示例程序分析树的建立和循环不变式的计算过程。
具体实施方式
下面结合附图和实施例对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
在本发明的描述中,若干的含义是一个以上,多个的含义是两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
本发明的描述中,参考术语“一个实施例”、“一些实施例”、“示意性实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
实施例1
一种间接跳转目标地址识别方法,包括:
将二进制程序解码成汇编语句,转换成中间表示BRIL;
根据BRIL语义和控制流结构计算并更新λ表达式,得到循环不变式,将循环不变式保存到分析树的结点中;
将约束表达式置空,从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集;
对约束表达式集迭代求解,直到间接跳转目标地址不再发生变化,得到识别出的间接跳转目标地址。
一种基于循环不变式的间接跳转目标地址识别方法,主要包括对控制流计算循环不变式、对分析树生成约束表达式集、对约束表达式集迭代求解三个部分,其中:
对控制流循环不变式的计算,是指根据定值语句的语义和控制流结构计算λ表达式的过程。首先定值语句根据其语义可以分为常定值和自定值,分别对应不同形式的λ表达式,然后根据控制流结构计算并更新λ表达式,得到循环不变式。
对分析树约束表达式集的生成,是指深度优先遍历分析树,将循环不变式不断约简合并,生成λ表达式集合的过程。首先从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,然后由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集。
对约束表达式集的迭代求解,是指将初始值输入约束表达式集,计算出间接跳转目标地址,然后将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行分析树的构建、约束表达式集的生成和求解,直到间接跳转目标地址不再发生变化(不动点)。
具体步骤如下:
步骤1)将二进制程序解码成汇编语句,接着转换成中间表示BRIL(BinaryAnalysis Intermediate Language)。在解码出间接跳转语句的时候,识别用符号表示的“跳转”变量,并将程序入口作为分析入口,初始值置空,进行步骤3中描述的分析树构建方法。“跳转”变量是指在BRIL语言中,形如Jmp x语句中的变量x。
步骤2)对定值语句计算λ表达式。定值语句依照其语义可以分为常定值和自定值。常定值是指形如x:=24用常数定值的语句,生成的λ表达式可以表示为λx.24;自定值是指形如x:=x+1仅用变量自身定值的语句,生成的λ表达式可以表示为λx.x+1。
步骤3)对控制流计算循环不变式,并构建分析树。首先初始化K索引为0(K是循环不变式中的自由变量),建立只有根节点的分析树,并将分析指针指向此结点。接着从分析入口开始,按照控制流遍历程序,不断更新分析树、指针表和K索引。最后当遍历终止时,在分析树结点中保存的就是控制流循环不变式。
步骤3.1)对于无条件跳转语句,分析树和K索引保持不变。将语句地址和分析指针保存到指针表。然后,跳转到操作数指向的语句,重新进行步骤3描述的分析树构建方法。
步骤3.2)对于条件跳转语句,分析树和K索引保持不变。将语句地址和分析指针保存到指针表。然后,跳转到操作数指向的语句或者顺序执行的下一条语句,重新进行步骤3描述的分析树构建方法,并缓存此时语句的选择和指针表。
步骤3.3)对于定值语句,K索引保持不变。如果语句地址不在指针表中,那么就在分析指针指向结点的空子树处,创建新的结点,并在结点中保存由步骤2计算出的λ表达式。然后,将分析指针指向此结点,并保存语句地址和分析指针到指针表;如果语句地址在指针表中,那么就进行步骤4描述的λ表达式更新替换方法。
步骤3.4)对于间接跳转语句,分析树保持不变,K索引增加1。从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态。接着,跳转到与之前语句选择不同的语句,重新进行步骤3描述的分析树构建方法,直到缓存为空。
步骤3.5)对于终止语句,分析树和K索引保持不变。从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态。接着,跳转到与之前语句选择不同的语句,重新进行步骤3描述的分析树构建方法,直到缓存为空。
步骤4)对λ表达式进行更新替换。首先将语句地址对应的分析指针从指针表中取出。接着根据分析指针指向结点的类型,计算循环不变式并更新替换结点中的λ表达式。
步骤4.1)如果分析指针指向的结点不是循环不变式结点,那么更新替换其中保存的λ表达式,并将此结点标记为循环不变式结点。
步骤4.1.1)对于自定值语句,更新替换方法是将λ表达式中的常数项乘以Ki,其中i是K索引。例如,λ表达式为λx.x+2,K索引为1,那么更新替换之后的λ表达式为λx.x+2*K1。
步骤4.1.2)对于非自定值语句,更新替换前后的λ表达式形式相同。例如λ表达式为λx.24,那么更新替换后的λ表达式同样为λx.24。
步骤4.2)如果分析指针指向的结点是循环不变式结点,那么从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态。接着,跳转到与之前语句选择不同的语句,重新进行步骤3中描述的分析树构建方法,直到缓存为空。
步骤5)对分析树约束表达式集的生成。首先将约束表达式置空,接着从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,然后由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集。
步骤5.1)当约束表达式为空时,约简的λ表达式就是合并结果。
步骤5.2)当约束表达式不为空时,将约束表达式的自由变量替换成λ表达式(β规约),然后对约束表达式进行约简,得到合并结果。
步骤6)对约束表达式集迭代求解。首先将初始值输入约束表达式集,计算出间接跳转目标地址。如果约束表达式无法求出间接跳转目标地址,则舍弃此约束表达式。接着将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行步骤3中描述的分析树构建方法,直到间接跳转目标地址不再发生变化(不动点)。至此,在迭代过程中得到的所有结果,就是本发明识别出的间接跳转目标地址。
步骤6.1)如果约束表达式不包含Ki,那么将“跳转”变量替换成初始值之后,再进行数学运算,得到间接跳转目标地址。例如,约束表达式为λx.x+3,初始值为1,那么得到间接跳转目标地址为4。
步骤6.2)如果约束表达式包含Ki,那么将“跳转”变量替换成初始值之后,再对Ki合理取值和数学运算,得到间接跳转目标地址。Ki的取值是从0开始的整数,同一个约束表达式中的Ki不能同时为0,并要确保间接跳转目标地址在有效范围内。例如,约束表达式是λx.x+3*K2,初始值是5,间接跳转目标地址的有效范围是0到12,那么K2只能取1和2,得到间接跳转目标地址为8和11。
本发明选取一个包含循环结构的二进制程序进一步说明基于循环不变式的间接跳转目标地址识别方法,而不能以此来限制本发明的保护范围。
以上是本发明选取的示例二进制程序对应的BRIL中间表示和程序控制流图(CFG)。
Step 1)在解码示例二进制程序时,识别出在地址0x8处的间接跳转语句jmpx,以及其中的“跳转”变量x。
Step 2)对控制流计算循环不变式,并构建分析树。首先初始化K索引为0,建立只有根节点的分析树,并将分析指针指向此结点。接着从分析入口开始,按照控制流遍历程序,不断更新分析树、指针表和K索引。最后当遍历终止时,在分析树结点中保存的就是控制流循环不变式。
图3描述了分析树的构建和循环不变式的计算过程。
上表描述了在分析树构建过程中,K索引、分析指针和缓存的变化,以及每个序号对应的操作步骤。
Step 3)对分析树生成约束表达式集。首先将约束表达式置空,接着从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,然后由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集。
序号 | 分析树结点 | λ表达式 | 约束表达式 | 备注 |
1 | a | - | - | 初始化 |
2 | b | λx.10 | λx.10 | 步骤5.1 |
3 | c | λx.x-5*K1 | λx.10-5*K1 | 步骤5.2 |
4 | d | λx.x-1 | λx.9 | 步骤5.2 |
5 | e | λx.x-2 | λx.7 | 步骤5.2 |
上表描述了约束表达式集的生成过程,其中在叶子结点c处,得到的约束表达式是λx.10-5*K1;在叶子结点e处,得到的约束表达式是λx.7。
Step 4)假设二进制程序仅包含示例中的代码,对于约束表达式λx.10-5*K1,令x为空,K1取0或1,得到间接跳转目标地址为0x0和0x5。对于约束表达式λx.7,令x为空,得到间接跳转目标地址为0x7。
Step 5)将地址0x0、0x5和0x7分别作为初始值,其指向的语句分别作为分析入口,重新进行分析树的构建、约束表达式集的生成和求解。最后发现间接跳转目标地址仍然为0x0、0x5和0x7,迭代达到不动点,分析终止。至此,本发明识别出的间接跳转目标地址为0x0、0x5和0x7。
实施例2
第二方面,本实施例提供了一种间接跳转目标地址识别装置,包括处理器及存储介质;
所述存储介质用于存储指令;
所述处理器用于根据所述指令进行操作以执行根据实施例1所述方法的步骤。
实施例3
第三方面,本实施例提供了一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现实施例1所述方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (7)
1.一种间接跳转目标地址识别方法,其特征在于,包括:
将二进制程序解码成汇编语句,转换成中间表示BRIL;
根据BRIL语义和控制流结构计算并更新λ表达式,得到循环不变式,将循环不变式保存到分析树的结点中;
将约束表达式置空,从分析树根节点开始,按深度优先序,将遍历到的循环不变式不断约简合并,由叶子结点处约简合并出的λ表达式,构成分析树的约束表达式集;
对约束表达式集迭代求解,直到间接跳转目标地址不再发生变化,得到识别出的间接跳转目标地址;
其中,根据BRIL语义和控制流结构计算并更新λ表达式,得到循环不变式,将循环不变式保存到分析树的结点中,包括:初始化循环不变式中的自由变量K索引为0,建立只有根节点的分析树,并将分析指针指向此结点;从分析入口开始,按照控制流遍历程序,不断更新分析树、指针表和K索引;当遍历终止时,在分析树结点中保存的就是控制流循环不变式;其中分析树、指针表和K索引的更新方法,包括:
对于无条件跳转语句,分析树和K索引保持不变;将语句地址和分析指针保存到指针表,跳转到操作数指向的语句,重新进行分析树的构建方法;
对于条件跳转语句,分析树和K索引保持不变;将语句地址和分析指针保存到指针表;跳转到操作数指向的语句或者顺序执行的下一条语句,重新进行分析树的构建方法,并缓存此时语句的选择和指针表;
对于定值语句,K索引保持不变;如果语句地址不在指针表中,那么就在分析指针指向结点的空子树处,创建新的结点,并在结点中保存根据语句语义计算的λ表达式,将分析指针指向此结点,并保存语句地址和分析指针到指针表;如果语句地址在指针表中,进行λ表达式的更新替换操作;
对于间接跳转语句,分析树保持不变,K索引增加1;从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态,跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空;
对于终止语句,分析树和K索引保持不变;从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态,跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空。
2.根据权利要求1所述的间接跳转目标地址识别,其特征在于,λ表达式更新替换方法,包括:
将语句地址对应的分析指针从指针表中取出;
如果分析指针指向的结点不是循环不变式结点,更新替换其中保存的λ表达式,并将此结点标记为循环不变式结点;其中,对于自定值语句,更新替换方法是将λ表达式中的常数项乘以Ki,其中i是K索引;对于非自定值语句,更新替换前后的λ表达式形式相同;
如果分析指针指向的结点是循环不变式结点,从缓存恢复指针表和分析指针到上一个条件跳转语句时的状态;跳转到与之前语句选择不同的语句,重新进行分析树的构建方法,直到缓存为空。
3.根据权利要求1所述的间接跳转目标地址识别,其特征在于,将循环不变式不断约简合并,包括:
当约束表达式为空时,约简的λ表达式就是合并结果;
当约束表达式不为空时,将约束表达式的自由变量替换成λ表达式,然后对约束表达式进行约简,得到合并结果。
4.根据权利要求1所述的间接跳转目标地址识别,其特征在于,对约束表达式集迭代求解方法,包括:
将初始值输入约束表达式集,计算出间接跳转目标地址;如果约束表达式无法求出间接跳转目标地址,则舍弃此约束表达式;
将目标地址处的语句作为分析入口,目标地址作为初始值,重新进行分析树的构建、约束表达式集的生成和求解,直到间接跳转目标地址不再发生变化;
在迭代过程中得到的所有结果,就是识别出的间接跳转目标地址。
5.根据权利要求4所述的间接跳转目标地址识别,其特征在于,计算出间接跳转目标地址,包括:
如果约束表达式不包含Ki,其中i是K索引,将“跳转”变量替换成初始值之后,再进行数学运算,得到间接跳转目标地址;
如果约束表达式包含Ki,其中i是K索引,将“跳转”变量替换成初始值之后,再对Ki合理取值和数学运算,得到间接跳转目标地址;其中Ki的取值是从0开始的整数,同一个约束表达式中的Ki不能同时为0,并要确保间接跳转目标地址在有效范围内。
6.一种间接跳转目标地址识别装置,其特征在于,包括处理器及存储介质;
所述存储介质用于存储指令;
所述处理器用于根据所述指令进行操作以执行根据权利要求1至5任一项所述方法的步骤。
7.一种存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210686923.1A CN115129320B (zh) | 2022-06-17 | 2022-06-17 | 一种基于循环不变式的间接跳转目标地址识别方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210686923.1A CN115129320B (zh) | 2022-06-17 | 2022-06-17 | 一种基于循环不变式的间接跳转目标地址识别方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115129320A CN115129320A (zh) | 2022-09-30 |
CN115129320B true CN115129320B (zh) | 2024-05-24 |
Family
ID=83378101
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210686923.1A Active CN115129320B (zh) | 2022-06-17 | 2022-06-17 | 一种基于循环不变式的间接跳转目标地址识别方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115129320B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1900910A (zh) * | 2005-07-22 | 2007-01-24 | 中国科学院计算技术研究所 | 二进制翻译中经由跳转表的多目标分支语句的识别方法 |
CN106648818A (zh) * | 2016-12-16 | 2017-05-10 | 华东师范大学 | 一种目标代码控制流图生成系统 |
CN106775913A (zh) * | 2016-12-16 | 2017-05-31 | 华东师范大学 | 一种目标代码控制流图生成方法 |
CN107357566A (zh) * | 2017-06-06 | 2017-11-17 | 上海交通大学 | 多架构二进制相似代码检测系统及方法 |
CN111859388A (zh) * | 2020-06-30 | 2020-10-30 | 广州大学 | 一种多层次混合的漏洞自动挖掘方法 |
KR20220062813A (ko) * | 2020-11-09 | 2022-05-17 | 한국인터넷진흥원 | 바이너리 내 비교문 분석을 통한 퍼징 입력 값 생성 방법 및 장치 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10354069B2 (en) * | 2016-09-02 | 2019-07-16 | Bae Systems Information And Electronic Systems Integration Inc. | Automated reverse engineering |
-
2022
- 2022-06-17 CN CN202210686923.1A patent/CN115129320B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1900910A (zh) * | 2005-07-22 | 2007-01-24 | 中国科学院计算技术研究所 | 二进制翻译中经由跳转表的多目标分支语句的识别方法 |
CN106648818A (zh) * | 2016-12-16 | 2017-05-10 | 华东师范大学 | 一种目标代码控制流图生成系统 |
CN106775913A (zh) * | 2016-12-16 | 2017-05-31 | 华东师范大学 | 一种目标代码控制流图生成方法 |
CN107357566A (zh) * | 2017-06-06 | 2017-11-17 | 上海交通大学 | 多架构二进制相似代码检测系统及方法 |
CN111859388A (zh) * | 2020-06-30 | 2020-10-30 | 广州大学 | 一种多层次混合的漏洞自动挖掘方法 |
KR20220062813A (ko) * | 2020-11-09 | 2022-05-17 | 한국인터넷진흥원 | 바이너리 내 비교문 분석을 통한 퍼징 입력 값 생성 방법 및 장치 |
Also Published As
Publication number | Publication date |
---|---|
CN115129320A (zh) | 2022-09-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
US11481494B2 (en) | System and method for identifying and comparing code by semantic abstractions | |
US11216258B2 (en) | Direct function call substitution using preprocessor | |
JP2017519300A (ja) | ソフトウェアアナリティクスのためのシステム及び方法 | |
Shi et al. | Learning execution through neural code fusion | |
US10459707B2 (en) | Instruction-set simulator and its simulator generation method | |
Di Federico et al. | A jump-target identification method for multi-architecture static binary translation | |
CN110990058B (zh) | 软件相似性度量方法及装置 | |
US20110214110A1 (en) | Compiler Mechanism for Handling Conditional Statements | |
US8458679B2 (en) | May-constant propagation | |
Xu et al. | Dsmith: Compiler fuzzing through generative deep learning model with attention | |
De Nicolao et al. | ELISA: ELiciting ISA of raw binaries for fine-grained code and data separation | |
Moyen et al. | Loop quasi-invariant chunk detection | |
CN115129320B (zh) | 一种基于循环不变式的间接跳转目标地址识别方法及装置 | |
Chen et al. | Supersonic: Learning to generate source code optimisations in c/c++ | |
US20150363177A1 (en) | Multi-branch determination syntax optimization apparatus | |
Escalada et al. | Improving type information inferred by decompilers with supervised machine learning | |
Xu et al. | Tree2tree structural language modeling for compiler fuzzing | |
CN114816436A (zh) | 一种基于反汇编的源码解析装置 | |
Artuso et al. | Binbert: Binary code understanding with a fine-tunable and execution-aware transformer | |
Liang et al. | Semantics-recovering decompilation through neural machine translation | |
Chen et al. | Compcodevet: A compiler-guided validation and enhancement approach for code dataset | |
Shao et al. | A survey of available information recovery of binary programs based on machine learning | |
Porpodas et al. | PostSLP: cross-region vectorization of fully or partially vectorized code | |
Avgerinos | Exploiting Trade-offs in Symbolic Execution for Identifying Security Bugs. |
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 |