CN105678169A - 一种二进制程序漏洞挖掘方法和系统 - Google Patents

一种二进制程序漏洞挖掘方法和系统 Download PDF

Info

Publication number
CN105678169A
CN105678169A CN201511025350.4A CN201511025350A CN105678169A CN 105678169 A CN105678169 A CN 105678169A CN 201511025350 A CN201511025350 A CN 201511025350A CN 105678169 A CN105678169 A CN 105678169A
Authority
CN
China
Prior art keywords
code
bil
model
promela
statement
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.)
Granted
Application number
CN201511025350.4A
Other languages
English (en)
Other versions
CN105678169B (zh
Inventor
崔艳鹏
胡建伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xi'an Humen Network Technology Co Ltd
Original Assignee
Xi'an Humen Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Xi'an Humen Network Technology Co Ltd filed Critical Xi'an Humen Network Technology Co Ltd
Priority to CN201511025350.4A priority Critical patent/CN105678169B/zh
Publication of CN105678169A publication Critical patent/CN105678169A/zh
Application granted granted Critical
Publication of CN105678169B publication Critical patent/CN105678169B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供一种二进制程序漏洞挖掘方法,包括步骤:将目标二进制程序转化为汇编语言并进行静态分析;结合静态分析的分析结果对中间语言进行Promela模型建模;构建漏洞模型插入到Promela模型中;引入外部C代码,基于SPIN模拟执行所述Promela模型,检测漏洞。本发明还提供一种二进制程序漏洞挖掘系统,包括预处理模块、代码转化模块和模型检测模块。该方法和系统,引入中间语言BIL作为二进制程序到Promela模型的转化桥梁,实现了对二进制程序的自动化建模,同时利用SPIN的嵌C功能实现模拟执行,并引入外部C代码来弥补模型检测的不足。实验表明,该方法可以有效检测二进制程序的内存破环型漏洞。

Description

一种二进制程序漏洞挖掘方法和系统
技术领域
本发明涉及计算机应用技术领域,特别涉及一种二进制程序漏洞挖掘方法和系统。
背景技术
从漏洞挖掘对象来分,软件漏洞挖掘可以分为两类:一类是针对源代码的漏洞挖掘;另一类是针对二进制程序的漏洞挖掘。源代码漏洞挖掘的最大特点是:有丰富、完备的语义信息。所以,针对源代码的漏洞挖掘相对比较容易。一般采用静态分析的方法就可以检测出漏洞,且在静态分析时,由于有明确的程序执行路径,所以其通常有较高的代码覆盖率。
然而源代码毕竟不是二进制程序,源代码层次的安全并不代表二进制程序的安全,两者之间的对应性无从验证,比如,源代码中不存在编译、链接过程中引入的漏洞。Linux系统下的符号链接漏洞就是在链接过程中引入的漏洞,该类漏洞在源代码中并不存在,却真实地存在于二进制程序中。另一方面,由于商业利益和软件产权保护等问题,很多时候安全工作者并不能拿到软件源代码,而只能针对二进制程序进行漏洞挖掘。所以,研究二进制程序的漏洞挖掘具有十分重要的意义。
从语义信息上来说,二进制漏洞挖掘要比源代码困难许多,因为它面对的不是具有完整语义的高级语言,而是贴近系统底层的机器码。也正因为此,对二进制程序进行漏洞挖掘,会比在源码上更加实用与准确。
对于二进制程序的漏洞挖掘,按照其是否真实执行可分为三类:1)静态分析法进行漏洞挖掘;2)动态执行法进行漏洞挖掘;3)动静结合进行漏洞挖掘。
静态分析指在不执行程序的情况下,对程序进行语义、流程分析的技术。静态分析中,目前研究较多的是静态污点分析(Statictaintanalysis)和符号执行(Symbolicexecution)。静态污点分析是在程序数据流和控制流分析的基础上,将输入数据标记为“污染数据”(不可信数据),然后检查被污染数据是否影响程序中某些关键节点,比如:jmp、call指令。如果影响,则认为存在漏洞。而符号执行指在不真实执行程序的情况下,用符号值表示程序变量的值,然后模拟程序执行来进行相关分析。
动态执行指通过真实执行二进制程来进行漏洞挖掘。该技术目前采用较多是动态污点分析(Dynamictaintanalysis)和模糊测试(Fuzzing)。动态污点分析和静态污点分析的原理基本相同。区别在于,静态污点分析在检测时并不真正运行程序,而是通过模拟程序的执行来传播污点标记;而动态污点分析技术需要运行程序,同时实时传播并检测污点标记。模糊测试(Fuzzing)在一种基于动态执行的漏洞挖掘方法,在整个软件漏洞挖掘领域中占有重要地位,也是目前二进制程序漏洞的主要挖掘方式。该技术通过构造不同样本数据来测试二进制程序的执行状况,从而确定目标程序是否存在漏洞。
静态分析与动态执行技术都有其各自的优缺点,比如:静态分析的优势在于分析全面,但准确性差强人意。动态执行在准确性上表现良好,但代码覆盖率很低。仅仅依靠静态或者动态的方式对二进制程序进行漏洞挖掘显然存在一定的弊端,如何采用动静结合的方式进行有效的漏洞挖掘是该领域技术人员需要解决的技术问题。
发明内容
本发明提供一种二进制程序漏洞挖掘方法和系统,以解决上述技术问题。
本发明提供的一种二进制程序漏洞挖掘方法,包括步骤:
步骤A,采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图;
步骤B,通过中间语言平台BAP将所述汇编语言转化为BIL语言,并结合静态分析的分析结果对所述BIL语言进行Promela模型建模;
步骤C,构建漏洞模型,并插入到所述Promela模型中;
步骤D,引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行所述Promela模型,检测漏洞;
步骤E,输出检测结果和漏洞信息。
其中,所述步骤B中结合静态分析的分析结果对所述BIL语言进行Promela模型建模包括步骤:
B1,依据静态分析得出的函数流图,对BIL代码进行程序切片切分成BIL语句;
B2,进行从切分后得到的BIL语句到Promela语句的细粒度代码转化;
B3,将经过细粒度代码转化后的Promela语句构建、组装成Promela模型。
其中,步骤B1包括步骤:
依据静态分析的函数流图,以sub函数为单位,将BIL代码切分成不同函数片断;
对BIL代码中的汇编指令进行多维度匹配,将所述函数片断切分成指令集;
对BIL语句的完备性进行检验,以将BIL指令集切分成BIL语句。
其中,步骤B2包括步骤:
预先对BIL语句的各种特征进行总结,并构建BIL语句的特征池将其置于特征池中;
将待转化的BIL语句与所述特征池中的特征进行匹配;
将匹配后的BIL语句转化为符合Promela中嵌C语法的Promela语句。
其中,步骤C包括:
对已知的软件漏洞样本进行分析总结,抽象出漏洞特征,用Promela语言描述漏洞特征,建立漏洞模型;
采用代码插桩技术,将所述漏洞模型插入到所述Promela模型中。
其中,步骤D中引入外部C代码修补SPIN包括步骤:
预先设置外部C代码,来构建执行所述Promela模型必要的系统资源、维护临时状态、处理SPIN无法处理的BIL中的表达式和关键字以及处理BAP无法解析的汇编指令;
步骤D中基于修补后的SPIN模拟执行所述Promela模型,检测漏洞包括步骤:
将Promela模型转化为C代码程序;
使用编译器将转化后的C代码和外部C代码联合编译成一个可执行程序;
执行编译好的可执行程序进行模型检测。
本发明还提供一种二进制程序漏洞挖掘系统,包括预处理模块、代码转化模块和模型检测模块;
预处理模块,用于采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图;
代码转化模块,用于通过中间语言平台BAP将汇编语言转化为BIL语言,并结合静态分析的分析结果对BIL语言进行Promela模型建模;构建漏洞模型插入到Promela模型中;
模型检测模块,用于引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行所述Promela模型,检测漏洞;输出检测结果和漏洞信息。
其中,代码转化模块,用于:
依据静态分析得出的函数流图,对BIL代码进行程序切片切分成BIL语句;进行从切分后得到的BIL语句到Promela语句的细粒度代码转化;将经过细粒度代码转化后的Promela语句构建、组装成Promela模型;对已知的软件漏洞样本进行分析总结,抽象出漏洞特征,用Promela语言描述漏洞特征,建立漏洞模型;采用代码插桩技术,将所述漏洞模型插入到所述Promela模型中。
其中,代码转化模块,用于:
依据静态分析的函数流图,以sub函数为单位,将BIL代码切分成不同函数片断;对BIL代码中的汇编指令进行多维度匹配,将所述函数片断切分成指令集;对BIL语句的完备性进行检验,以将BIL指令集切分成BIL语句;
预先对BIL语句的各种特征进行总结,并构建BIL语句的特征池将其置于特征池中;将待转化的BIL语句与所述特征池中的特征进行匹配;将匹配后的BIL语句转化为符合Promela中嵌C语法的Promela语句。
其中,模型检测模块,用于:
预先设置外部C代码,来构建执行所述Promela模型必要的系统资源、维护临时状态、处理SPIN无法处理的BIL中的表达式和关键字以及处理BAP无法解析的汇编指令;将Promela模型转化为C代码程序;使用编译器将转化后的C代码和外部C代码联合编译成一个可执行程序;执行编译好的可执行程序进行模型检测。
本发明实施例提供了一种二进制程序漏洞挖掘方法和系统,将待挖掘的目标二进制程序转化为汇编语言,并进行汇编语言层次漏洞的静态分析,结合静态分析的分析结果对中间语言BIL进行Promela模型建模,利用中间语言作为桥梁实现二进制程序的自动化建模,进而利用SPIN的嵌C功能进行模拟执行,并引入外部C代码来弥补模型检测的不足,实现漏洞的模型检测。如此,用静态分析结果优化模型检测的模拟执行,提出了一种新的采用动静结合并基于模型检测进行漏洞挖掘的机制,实现了静态分析与动态执行的结合;使用该方法和系统进行漏洞挖掘测试,结果表明,该漏洞挖掘方法和系统能够准确地挖掘出已知的软件漏洞,且能得到精确的漏洞类型与位置信息,实现了基于动静结合构思进行有效的漏洞挖掘。
外部C代码的引入使得该漏洞挖掘系统的实现成为可能的同时,也扩展、改进了SPIN的模型执行性能。
附图说明
图1为本发明二进制程序漏洞挖掘方法一个实施例的流程示意图;
图2位本发明二进制程序漏洞挖掘系统的一个实施例的结构框架示意图;
图3本发明实施例中模型检测漏洞挖掘流程图;
图4本发明实施例中自动化建模过程;
图5本发明实施例中SPIN验证过程;
图6本发明实施例中外部C代码引入SPIN的原理图;
图7本发明实施例中漏洞挖掘系统设计框架;
图8本发明实施例中漏洞挖掘一个较佳实施例;
图9本发明实施例静态分析流图;
图10为本发明实施例程序切片基本流程;
图11为本发明实施例细粒度代码转化流程图;
图12为本发明实施例Promela全局声明结构;
图13为本发明实施例函数栈帧;
图14为本发明实施例栈溢出模型;
图15位本发明实施例中堆的三种操作;
图16为本发明实施例中SPIN平台的状态遍历;
图17本发明实施例中SPIN执行检测结果;
图18本发明实施例中检测到程序存在栈溢出漏洞;
图19本发明实施例中检测到程序存在信息泄露漏洞。
具体实施方式
本发明实施例提供了一种二进制程序漏洞挖掘方法和系统。参见图1所示,该方法包括步骤:
步骤S110,采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图;
步骤S111,通过中间语言平台BAP将汇编语言转化为BIL语言,并结合静态分析的分析结果对BIL语言进行Promela模型建模;
步骤S112,构建漏洞模型,并插入到Promela模型中;
步骤S113,引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行Promela模型,检测漏洞;
步骤S114,输出检测结果和漏洞信息。
本发明实施例还提供一种二进制程序漏洞挖掘系统,参见图2所示,包括预处理模块、代码转化模块和模型检测模块。
预处理模块,用于采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图。
代码转化模块,用于通过中间语言平台BAP将汇编语言转化为BIL语言,并结合静态分析的分析结果对BIL语言进行Promela模型建模;构建漏洞模型插入到Promela模型中;
模型检测模块,用于引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行Promela模型,检测漏洞;输出检测结果和漏洞信息。
优选地,代码转化模块,用于:依据静态分析得出的函数流图,对BIL代码进行程序切片切分成BIL语句;进行从切分后得到的BIL语句到Promela语句的细粒度代码转化;将经过细粒度代码转化后的Promela语句构建、组装成Promela模型。
代码转化模块还用于对已知的软件漏洞样本进行分析总结,抽象出漏洞特征,用Promela语言描述漏洞特征,建立漏洞模型;采用代码插桩技术,将该漏洞模型插入到Promela模型中。
优选地,模型检测模块,用于:预先设置外部C代码,来构建执行Promela模型必要的系统资源、维护临时状态、处理SPIN无法处理的BIL中的表达式和关键字以及处理BAP无法解析的汇编指令;将Promela模型转化为C代码程序;使用编译器将转化后的C代码和外部C代码联合编译成一个可执行程序;执行编译好的可执行程序进行模型检测。
本发明实施例中模型检测(ModelChecking)的基本思想是:对于一个给定的系统模型,采用状态空间搜索的方法检测该模型是否满足某个用时序逻辑公式表示的特定性质。首先需要将所要验证的系统行为描述为有限状态自动机,然后建立该行为的时态逻辑限制。通过遍历自动机上的全部可达状态,判断逻辑表达式在某一状态下是否可被满足。如果满足则认为存在故障,此时往往还能获得产生故障的系统执行路径。即,模型检测通过遍历所有状态空间,自动验证有穷状态系统。
如图3所示,首先对给定的目标程序进行建模,并将其转化为模型检测工具所接受的描述模型。其次对需要检测的安全缺陷属性即漏洞进行描述。安全缺陷属性指在实际编程开发中的不良编程习惯、程序逻辑错误代码等缺陷代码的总结抽象。安全缺陷的属性描述指用形式化语言描述总结抽象出来的安全缺陷。当系统建模和安全缺陷属性描述完成后,就可以在模型检测平台中进行有限状态遍历。如果在某个状态下,系统模型不满足安全缺陷属性所描述的规范,则说明该系统模型符合安全要求,否则,认为程序中存在安全缺陷描述的相关漏洞。
一般情况下,模型检测被用于检测程序的逻辑漏洞,而不是常见的内存破坏类型漏洞,比如栈溢出、信息泄露等。
基于动静结合的思路,本发明实施例提出一种用模型检测来进行漏洞挖掘的新方法。该方法在汇编语言上进行静态分析,然后根据分析结果优化模型检测的模拟执行,最终在模型执行过程中挖掘出软件的内存破坏型漏洞。该方法的创新点在于将模型检测引入到二进制程序的漏洞挖掘中,并融合动静结合的思想,用静态分析结果优化模型检测的模拟执行。
SPIN(SimplePromelaInterpreter)是基于模型检测的漏洞分析平台,以Promela语言为输入语言。目标程序(需要被检测的程序)用Promela语言进行建模,然后SPIN对建立的模型进行模拟执行,进而发现程序漏洞。SPIN支持随机、交互式和指导性的模拟验证。
然而SPIN并不能支持二进制程序漏洞的挖掘,因此本发明实施例解决了将SPIN适用于二进制程序漏洞挖掘所存在的技术问题,主要是如何自动化地用Promela语言对二进制程序进行建模并保证准确性,以及如何构建二进制程序模拟执行过程中所用到的系统资源。
每个待检测的二进制程序都需要用Promela语言对其进行建模。因为只有建立模型后,才能在SPIN上用模型检测的方法进行漏洞挖掘。所以,需要一种自动化的建模过程,并保证建模结果的准确性。建模准确与否将直接影响漏洞挖掘的效果。
为了解决该问题,本发明实施例引入中间语言来连接二进制程序和Promela模型。在SPIN0.4及其以后版本,SPIN都提供了对嵌入C代码的支持。这意味着在Promela中可以嵌入C语言代码来进行程序建模。由于许多中间语言具有与C语言相似的语义表达,因此,只需要对这种类C中间语言进行程序切片分析可以达到智能转化的效果。
经研究发现,作为一种可实施方式,BAP(BinaryAnalysisPlatform)平台下的BIL语言是较为适合的类C语义的中间语言。该语言是对汇编指令的细粒度解释,其所用的描述语句和C语言很相似。整个自动化建模过程如图4所示。
如图4所示,该方法借助BAP将二进制程序转化为BIL语言,然后采用程序切片技术将BIL语言转化为Promela语言。只要二进制程序完整,转化成的Promela模型完全就是对二进制程序的逐行解释。这样也就保证了转化后Promela模型的准确性。
BIL语言是以汇编指令为单位组织其BIL语句,例如表1所示:
表1
表1中代码是BIL的基本单位,将其称为一个BIL指令集,包含3部分:
保留的汇编指令,在此为“POPEBP”;
BIL指令集的标签,即指令集地址。BIL中的跳转就是根据这个标签地址来寻址;
BIL语句。在此例中,有两个BIL语句,第一句是将当前栈顶的数据返回给寄存器EBP,第二句是将栈顶指针下移一位(加4字节)。可以看出,BIL语句就是对汇编指令进行完全解释。
将BIL的基本单位转化为Promela语言,相应的Promela模型代码片段如表2所示:
表2
对比表1中的BIL指令集:第一个BIL语句是内存读取操作,所以将其转化为mem_load函数(该函数会提前定义)。第二个BIL语句仅仅是加上一个c_code{}关键字。
分析表2中的Promela语句,需要定义一个虚拟栈来维护栈上数据的存取。这就是上文提到的、需要解决的第二个问题,即构建程序在模拟执行过程中所用到的系统资源。
按照前述建模方式,Promela模型在模拟执行时可能要与操作系统资源进行交互。为了保证Promela模型的正常运行,需要构建一些虚拟的系统资源,比如虚拟堆、虚拟栈等。
本发明实施例引入外部C代码来构建系统资源,成功解决此问题。
与其它模型检测不同,SPIN并不是执行模型本身,而是生成模型对应的C语言代码,然后进行编译执行。其基本结构如图5所示。
SPIN进行模型检测的直接对象并不是Promela模型,而是Promela模型转化、编译后的可执行文件。之所以称为“外部C代码”是为了区别于SPIN平台自己转化的C语言代码。
SPIN将Promela模型转化为C代码,然后通过编译执行该C代码进行模型检测。如果用外部C代码实现系统资源的构建,在编译时,将SPIN转化的C代码和外部C代码联合编译成一个可执行文件。这样,当模型检测时,Promela模型转化的C代码就会与外部C代码进行直接交互。具体过程如图6所示:
首先将Promela模型转化为C代码,这一步用SPIN的-a参数可以实现。接下来,要进行C程序的编译,优选地,作为一种可实施方式,使用的编译器是GCC(GNUCompilerCollection,GNU编译器套装),此时需要将转化后的C代码和外部C代码联合编译成一个可执行程序。最后就是执行编译好的可执行文件进行模型检测并输出检测信息。
在模型检测时,需要设定反例来发现漏洞。由于该漏洞挖掘系统的设计目标是挖掘常见的软件漏洞。所以,需要用Promela语言建立软件漏洞模型。比如:检测栈溢出漏洞,就需要用Promela语言建立栈溢出漏洞违例,并将其加入到二进制程序转化成的Promela模型中。整个漏洞挖掘系统的设计框架如图7所示。
参见图7和图8所示,下面列举本发明实施例二进制漏洞挖掘方法的一个优选实施例,主要包括:
步骤a:借助反编译器IDA将二进制程序转化为汇编语言;
步骤b:通过中间语言平台BAP,将汇编语言转化为中间语言;
步骤c:在汇编代码层次做一些静态分析,并将结果输出给d过程;
步骤d:依据c过程的分析结果对中间语言进行代码建模,即用形式化语言表述目标二进制程序;
步骤e:对已有漏洞样本进行大量分析,提取特征,并抽象建模。这些漏洞模型也必须用形式化语言进行描述;
步骤f:引入代码插桩技术,将漏洞模型插入到代码模型中;
步骤g:在模型检测平台上运行代码模型,检测漏洞;
步骤h:输出检测结果和漏洞信息。检测结果指是否存在漏洞,漏洞信息包括但不限于漏洞位置、造成漏洞的样本数据。
以上过程大致可以分为3个阶段:
第一阶段,预处理阶段。包含步骤a,c,实现二进制程序到汇编代码的转化。并在汇编层次进行必要的静态分析。
第二阶段,包含步骤b,d,e,f,这个过程是整个漏洞挖掘系统的实现关键。根据静态分析的结果进行代码建模,并将漏洞模型添加其中。此阶段需要将中间语言代码转化为形式化语言,因此该阶段为转化阶段。
第三阶段,主要涉及步骤g,h,实现模型检测并将检测结果输出。这一阶段称为检测阶段。
IDA(InteractiveDisassemblerProfessional,交互式反汇编器专业版)是一款功能强大的交互式反汇编工具,主要用于对程序进行静态分析。由于IDApython脚本的使用,使得基于IDA的静态分析变得更为便捷与强大。因此,本文的静态分析将采用IDApython,在IDA的反汇编结果上进行。对于该漏洞挖掘系统,第一阶段将基于IDA进行,第二阶段需要借助BAP,并自己编写转化平台实现中间语言到Promela模型的转化。第三阶段直接借助SPIN和外部C代码就可以实现。
参见图8所示,整个过程借助4个平台,依次是IDA、BAP、il2pml以及SPIN。其中il2pml平台是本发明实施例基于所要解决的技术问题而自主开发与实现的转化平台,主要实现BIL程序切片分析、代码转化、Promela模型建立以及漏洞插入的功能。
基于IDA的静态分析,主要是流程分析、函数分类、间接跳转识别、多线程识别和数据段获取。具体的静态分析流程如图9所示:
静态分析中不仅使用了IDApython获取信息,还使用Python的第三方库PEfile进行API函数、数据段信息的获取。信息获取后,间接跳转、多线程以及数据段信息会被直接写入文件,而函数信息会进行二次分析。以函数为单位,组建起函数流程图。然后在流程图基础上进行函数分类。主要分为以下三类:
sub函数:程序员自己编写的函数,一般在没有符号表的情况下,IDA将其识别为sub_addr的形式;
lib函数:指在编译阶段被编译器链接进程序的运行时库函数;
API函数:指系统提供的底层函数,程序中只调用函数名,没有函数体。
使用BAP将二进制程序转化为中间语言BIL,BAP可以直接以目标程序为输入,将其转化为中间语言BIL,只需要直接使用toil命令即可,其使用范例如下:
Usage:toil-binbinary_file-oil_file.
其中,-bin选项指明要转化的目标程序,-o指明转化后的BIL文件。
基于程序切片的代码转化,代码转化的对象是BIL代码,结果是Promela模型。这个过程需要三步:程序切片、细粒度转化、构建Promela模型。
细粒度转化和构建Promela模型都是以程序切片为基础。
关于程序切片:本发明实施例利用静态的程序切片技术,基于预处理阶段的函数流图,对BIL代码进行程序切片。切片过程如图10所示。
程序切片的基本流程主要将BIL程序切分成3层:函数层、BIL指令集层和BIL语句层。每层的切分依据都有不同,这是由BIL代码的特点而决定。每次切分后,需要对切好的代码进行独立分析与信息提取。
1)函数片断的切分依据静态分析的函数流图,以sub函数为单位,将BIL代码切分成不同函数片断。切分之后需要获取如下信息:函数首地址、函数范围。其中,函数首地址将会被用来构成函数名,用以函数寻址。
2)BIL指令集是对函数片断的再次切分,由于BIL代码本身以BIL指令集为单位进行组织,且每一个BIL指令集都从一个汇编指令开始,所以,对BIL中的汇编指令进行多维度匹配就能将函数片断切分成指令集。切分之后需要获取如下信息:BIL中的汇编指令、lable标签及其后面的地址。lable标签及其后面的地址将作为Promela代码中的标签,用以指令寻址。
3)BIL语句是对BIL指令集的切分。一般情况下,在BIL指令集中,一行就是一个BIL语句。但有些语句可能占据几行,所以需要对BIL语句的完备性进行检验,包括:括号闭合原则,赋值语句平衡原则等。针对BIL语言,切分之后需要获取语句中的变量符号。
关于细粒度代码转化:
细粒度的代码转化建立在BIL代码的切分技术上。所谓细粒度指代码转化主要针对切分后的BIL语句。为了实现转化智能化,我们对BIL语句的各种特征进行总结,并将其置于特征池中。当进行BIL代码转化时,先在特征池中进行特殊转化,然后进行一般性的基本转化,最后输出Promela语句。其过程如图11所示。
如图11所示,先转化具有特征的BIL代码,比如BIL中“mem32:u32?u8”表示从内存中下载数据。在转化前,将此特征置于特征池中,一旦匹配,将其转化为mem_load()函数(该函数在Promela中专门负责内存数据读取)。特征池的建立是基于对大量BIL语句训练、总结而来。当前,该漏洞挖掘系统的特征池基本能够满足所有x86架构下BIL语句的转化。基本转化指将BIL语句转化为符合Promela中嵌C语法的转化过程。比如,对于所有BIL陈述语句都需要加c_code{}关键字,构成c_code{BIL语句}的形式。
在系统实现过程中,除了细粒度的代码转化,还会对函数片断层、BIL指令集层也做一些必要的转化。比如:指令集中的“labelpc_0x40103c”语句会被转化为“pc_0x40103c:”的形式。
构建Promela模型:
细粒度代码转化后,需要将所有转化后的代码构建、组装成Promela模型。根据SPIN平台以及Promela语法的特点,本发明实施例设计的Promela模型由如下部分组成:
Promela全局声明
sub函数转化成的Promela进程
系统函数转化成的Promela进程
漏洞模型
间接跳转表
对于此漏洞挖掘系统,每个Promela模型都必须包含前4部分。对于间接跳转表,只有在目标程序中包含有函数间接调用时才会自动生成。此外,之所以把sub函数和系统函数转化的Promela进程区分开,是因为两者实现方式有着根本区别。
1)Promela全局声明
Promela的全局声明是指在整个Promela程序中都会用到的全局变量或者宏定义。由于使用Promela嵌C模式,所以全局声明基本和C语言的声明模式相同。这也是该系统选用SPIN中嵌C模式的原因。全局声明的内容结构如图12所示:
Promela的全局声明被定义成一个固定模板,这是因为所有的Promela模型不仅都需要这些全局声明,而且所有的全局声明都相同。
2)sub函数转化成的Promela进程
Promela中的进程与C语言的函数很相似,既然Promela基本语法使用C语法,那么完全可以将C语言的函数转化为Promela中的进程。这也是程序切片时以函数为单位进行初次切片的原因。Promela模型中应该包含所有执行流程中的函数,所以,执行流程中的函数都应该被转化成Promela进程。
在细粒度的转化过程中,sub函数对应的所有BIL语句都会被转化为Promela语句。之后,这些Promela语句会被放入对应的Promela进程中。所以,sub函数到Promela进程的转化是一个自动化实现过程。不需要额外操作。
3)系统函数转化成的Promela进程
与sub函数的转化不同,在二进制代码中没有系统函数的函数体,仅仅是函数调用而已。以Windows为例,这些系统函数的函数体都是包含在一些底层动态链接库中,程序执行时,会加载这些动态链接库并执行相应函数。对于这种问题,本发明实施例如此解决:
手动将系统函数转化为Promela进程,并以固定模版的方式存于系统中。相当于对这些系统函数做了函数摘要。在生成Promela模型时,如果程序调用某个系统函数,转化过程会将其对应的Promela进程链接到Promela模型中。
4)间接跳转表
间接跳转和函数间接调用是许多静态分析框架中的难点,因为只有在动态执行的时候才能确定目的地址。对于我们的系统,也遇到这个问题。解决思路如下:
在预处理阶段进行初步静态分析,识别出间接跳转或者间接调用。一旦程序中存在间接调用,则在转化过程中会生成一个面向所有Promela进程的间接跳转表。当模型检测过程中遇到间接跳转时,程序首先转到间接跳转表中进行目标进程的搜寻,由于是对所有Promela进程建立间接跳转表,所以一定能找到,并转到目标进程中。
5)漏洞模型
对于此漏洞挖掘系统,在进行模型检测前,漏洞模型必然要被插入到Promela模型中。
关于漏洞模型的建立与插入:
漏洞模型是此漏洞挖掘系统的灵魂所在。只有建立相应的漏洞模型,才能检测出对应的程序漏洞。漏洞检测的准确性很大程度上取决于漏洞模型的准确性。关于漏洞模型,主要有两方面内容需要去做:其一是进行漏洞模型的建立;其二是将漏洞模型插入到Promela模型中。
漏洞模型的建立:
在此系统中,漏洞模型的建立指用Promela语言对常见的软件漏洞进行建模。这基于大量的漏洞分析基础之上,通过总结,抽象出漏洞特征,然后使用Promela语言将其描述出来。以栈溢出漏洞为例进行说明。
首先明确,栈溢出指将外部数据放到栈上时,其长度超过应有栈空间而造成的一种缓冲区溢出漏洞。根据函数调用约定,每个函数都有其独立的栈空间,称为栈帧。栈底是寄存器EBP所指向的地址,栈顶是寄存器ESP所指向的地址,如图13所示。
正常情况下,外部输入数据(这里仅指局部变量)是被放在相应的栈空间中。栈数据向下增长。如果这些输入数据不加长度检查而直接放入栈空间很容易导致溢出发生。过长的数据将冲破函数栈帧而覆盖返回地址。
当前的各系统都是通过在返回地址前增加校验值来规避栈溢出漏洞。进入函数后,在返回地址前插入一个随机数并保存副本,在函数体执行完后,系统会检查这个随机值是否和保存的副本一致。如果不一致,则认为存在栈溢出漏洞。
本发明实施例构建的栈溢出漏洞模型如图14所示。
如图14所示,进入Promela进程后,首先保存当前栈顶数据和寄存器EBP中的值;在进程执行结束前,判断保存的数值是否被篡改,如果是,则认为存在栈溢出漏洞。用Promela语言进行栈溢出漏洞的判定代码如表3所示:
表3栈溢出模型中的判定代码
如表3所示,当检测到漏洞,系统会输出漏洞类型和漏洞所在的位置。并使用Promela语言中的中断语句停止模型检测。漏洞模型是对现实中软件漏洞特征的高度总结与抽象,一个漏洞模型的建立意味着这一类的软件漏洞都可以用此模型去检测。
漏洞模型的插入:
在构建Promela模型时,建立的漏洞模型需要被链接进去。漏洞模型的插入建立在程序切片和细粒度代码转化的基础上。程序切片将所有代码细节展开,可以根据建立的漏洞模型将其插入任意想让其存在的位置。
以上述栈溢出漏洞模型为例,在进行代码转化时需要将“保存代码”和“检查代码”分别放在进程的初始位置和结束位置。而且对每个sub函数转化的Promela进程都需要添加。
在程序切片时,将BIL代码分为了以sub函数为单位的函数片断。且获取了函数首地址和函数地址范围,根据这两个信息,在转化时很容易将栈溢出漏洞的“保存代码”和“检查代码”插入到其相应位置。
外部C代码的引入,除了解决程序执行所需的系统资源以外,还解决了SPIN所存在的其他问题。具体地,外部C代码的引入主要是为了解决在模拟执行过程中SPIN无法解决的问题。这些问题不解决,该漏洞挖掘系统将难以进行正常的模拟执行。主要问题如下:
缺少程序执行必要的操作系统资源
缺少对临时状态的管理
不能处理BIL中的表达式和关键字
不能处理BAP无法解析的汇编指令
前两个问题是SPIN在模拟执行时遇到的问题,后两个问题是转化阶段所遗留下来的问题。所有这些问题都可以依靠引入外部C代码来实现。之所以称为“外部C代码”是为了区别于SPIN平台自己转化的C语言代码。外部C代码解决上述问题的基本原理如下:
SPIN将Promela模型转化为C代码,然后通过编译执行转化后的C代码进行模型检测。如果我们用外部C代码实现上述问题,在编译时,将SPIN转化的C代码和外部C代码联合编译成一个可执行文件。这样,当模型检测时,外部C代码就会修正、解决以上问题。具体地,外部C代码的设置主要执行以下操作:
建立系统环境:
在程序运行时,栈和堆是必不可少的系统资源。在模拟执行时,该系统需要模拟出一个虚拟的栈、堆,以便进行数据的存取。
1)虚拟栈
本发明实施例使用一个大数组来表示虚拟栈。栈上数据的存取相当于对此数组进行操作。栈上的数据行为比较简单,无非就是入栈和出栈,这本质上和数组的存取无异。所以,关于栈,只需要维护一个数组即可。
2)虚拟堆
堆也是由一个大数组来维护,由于堆的动态分配特性,在构建虚拟堆时,我们模拟了堆的三个操作:堆分配、堆释放与堆合并。参见图15,图15是堆的三种操作。
在进行三种操作时,需要维护两个单向链表:一个是空闲表,一个是分配表。分别表示当前空闲的堆块和已分配的堆块。
堆分配:从空闲的虚拟堆区中划分出指定空间,作为分配的堆块,并将此堆块链入分配表中。
堆释放:将指定的堆块从分配表中卸下,并链入空闲表中;
堆合并:在每次进行堆分配前,程序都会遍历现有堆块,将相邻的空闲堆块合并为一个大的空闲堆块。
系统环境的建立可以让程序在模拟执行时从虚拟栈、堆上存取数据,保证程序的正常执行。
管理临时状态:
一般情况下,临时状态不用去维护,SPIN自己会维护。但如果临时状态进入临时产生的状态分支,就需要进行状态管理。以打开或者创建一个文件为例:
在真实系统中,程序打开或者创建一个文件时,系统会为整个文件分配唯一的标识符,称之为文件ID。与模型检测不同,真实系统不涉及状态遍历的问题,所以在真实系统中不用考虑状态管理的问题。在模型检测中,会遇到状态遍历问题,如图16所示。
假设在A点处打开一个文件,程序执行过程中产生了6个状态分支,且分别在分支0、分支2和分支5的地方需要关闭打开的文件。模拟执行时,SPIN会依次遍历这6个状态,程序一共有3处文件关闭,但只有一处文件打开。如果在分支5处关闭文件,那么后续分支会因找不到文件句柄而出现执行错误。为了解决这个问题,使用一系列函数实现SPIN中临时状态的管理。具体解决方案如下:
假设在某节点上产生了n个状态分支,状态管理程序会为此节点设置一个值为n的计数器,当执行完一个状态后,n就减1,当全部遍历完,即n=0时,模型执行才会真正关闭打开的文件。
BIL表达式与关键字处理:
在转化过程中,BIL中的表达式和关键字被转化为C语言的函数调用模式。比如,表达式“mem32:u32?u8”被转化为mem_load()函数。但在转化后的Promela模型中,只有关于mem_load的函数调用,并没有真正的函数执行体。所以,我们需要在外部C代码中实现mem_load()函数。具体函数形式如下:
usizemem_load(usizeaddr,usizesize)
参数1:读取数据的内存地址
参数2:读取数据的长度(比特)
目前,使用外部C代码实现的BIL表达式与关键字如表4所示:
表4BIL关键字与表达式的C函数形式
表4中,前两个是BIL表达式,后三个是BIL关键字,其都用外部C代码定义并实现。以mem_load、extend为例,其在Promela模型中的调用代码如下:
c_code{R_ECX=extend(mem_load(R_EAX,8));};
其中,BIL关键字extend的功能是将8或16位数据扩展成32位。
BAP无法处理的汇编指令:
BAP平台也是一个不断发展和改进的系统,它能准确地转化大部分汇编指令。但,并非全部。对于BAP无法处理的指令,也可以通过引入外部C代码来弥补。比如:在最新的BAP0.8版本中不支持cltd指令的识别,如下表5所示。
表5BAP0.8不识别的cltd指令
查看错误信息发现,BAP0.8已经不支持单操作数的汇编指令。如果引入外部C代码,我们只需用C语言实现cltd指令的功能,然后在代码转化阶段将ctld指令转化成相应函数调用即可。如表6为ctld指令的C语言代码实现:
表6ctld指令的C语言代码实现
ctld指令很简单:将long型转化为Doublelong型。所以,只需要将寄存器EAX中的数值右移31位,然后赋值给EDX即可。
外部C代码的引入使得该漏洞挖掘系统的实现成为可能,它相当于扩展、改进了SPIN的模型执行,使SPIN变得更为强大。
采用本发明实施例的二进制程序漏洞挖据方法和系统分别对Freefloat.exe和zip.dll进行测试,可以发现其中的已知漏洞,并得出具体的漏洞类型与漏洞位置。
测试实例的基本信息如表7所示:
表7测试样本基本信息
程序名称 功能 漏洞类型 漏洞信息
FreeFloat.exe FTP服务器 栈溢出 Exploit-db
zip.dll ZIP压缩基础库 信息泄露 CVE-2012-1163
两个测试样本都是使用率较高的程序,各自存在一个典型的软件漏洞。同时两个二进制程序本身也有一些不同,一个是可执行程序,另一个是动态链接库程序。
测试FTP程序:
Freefloat.exe是一款x86平台下的FTP服务程序,其中存在栈溢出漏洞。当USER命令后负载过长数据时会造成栈溢出,让攻击者获取远程控制权限。用Promela语言给出的栈溢出反例模型如表8所示:
表8栈溢出模型的反例代码
如表8所示,在函数返回时,模型会判断返回地址是否被篡改,如果被篡改,则认为存在栈溢出漏洞。一旦检测到漏洞,系统会输出漏洞类型和漏洞所在位置,并使用Promela语言中的assert()语句停止模型检测。漏洞模型是对现实中软件漏洞特征的高度总结与抽象,一个漏洞模型的建立意味着这一类的软件漏洞都可以用此模型去检测。最终的检测结果如图17所示。
如图17是SPIN执行完毕后自动产生的检测报告。该报告主要侧重于测试时的代码覆盖和检测效能评估,漏洞信息则相当简陋。如图17所示,如果发现漏洞,会出现违反断言提示和error提示。确定error是不是漏洞,需要进行进一步的结果分析。
在外部C代码中加入监控代码,可以输出漏洞类型、漏洞位置,如图18所示。
图18结果表明该漏洞是一个栈溢出漏洞,且存在于进程fun_0x402de0中。映射到目标程序,漏洞应该在sub_0x402de0函数中。这与实际漏洞位置完全相同,说明该漏洞挖掘系统真实可行,且准确性高。
测试libzip程序:
libzip是一个zip解析的基础库,由C语言开发而成。其zip.dll模块在解析zip结构时存在信息泄露漏洞。现实存在大量的软件调用了该库进行文件的解压缩,比如MySQLWorkbench,Fuse-zip,PDFExpert等。如果libzip基础库存在漏洞,那么其影响范围将会相当广泛,危害程度将会相当大。测试结果如图19。
图19表明,zip.dll中存在信息泄露漏洞,且位于fun_0x10003400进程(或sub_0x10003400函数)中。这与实际分析的漏洞位置一致。
基于SPIN,本文提出了一种新的二进制程序漏洞挖掘方法和系统。对于模型检测,固有思维都是对并发系统程序的行为进行建模,然后模拟执行、验证逻辑故障。本文将模型检测应用于二进制程序的漏洞挖掘,采用新的挖掘机制,用以挖掘常见的内存破坏型漏洞。为了让模型检测适应于二进制程序,本发明实施例做了以下三点创新:
1)融合动静结合的思想,用静态分析结果优化模型检测的模拟执行;
2)利用中间语言作为桥梁实现二进制程序的自动化建模;
3)引入外部C代码来构建系统资源,以此来弥补SPIN的不足。
最终的实验结果表明,该方法可以检测出已知漏洞。
需要说明的是,本发明实施例中的装置或者系统实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。从硬件层面而言,如图2所示,为本发明实施例的一种硬件结构框架示意图,除了CPU、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,如负责处理报文的转发芯片等等。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的CPU将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

Claims (10)

1.一种二进制程序漏洞挖掘方法,其特征在于,包括步骤:
步骤A,采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图;
步骤B,通过中间语言平台BAP将所述汇编语言转化为BIL语言,并结合静态分析的分析结果对所述BIL语言进行Promela模型建模;
步骤C,构建漏洞模型,并插入到所述Promela模型中;
步骤D,引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行所述Promela模型,检测漏洞;
步骤E,输出检测结果和漏洞信息。
2.根据权利要求1所述的二进制程序漏洞挖掘方法,其特征在于,所述步骤B中结合静态分析的分析结果对所述BIL语言进行Promela模型建模包括步骤:
B1,依据静态分析得出的函数流图,对BIL代码进行程序切片切分成BIL语句;
B2,进行从切分后得到的BIL语句到Promela语句的细粒度代码转化;
B3,将经过细粒度代码转化后的Promela语句构建、组装成Promela模型。
3.根据权利要求2所述的二进制程序漏洞挖掘方法,其特征在于,所述步骤B1包括步骤:
依据静态分析的函数流图,以sub函数为单位,将BIL代码切分成不同函数片断;
对BIL代码中的汇编指令进行多维度匹配,将所述函数片断切分成指令集;
对BIL语句的完备性进行检验,以将BIL指令集切分成BIL语句。
4.根据权利要求2所述的二进制程序漏洞挖掘方法,其特征在于,所述步骤B2包括步骤:
预先对BIL语句的各种特征进行总结,并构建BIL语句的特征池将其置于特征池中;
将待转化的BIL语句与所述特征池中的特征进行匹配;
将匹配后的BIL语句转化为符合Promela中嵌C语法的Promela语句。
5.根据权利要求1所述的二进制程序漏洞挖掘方法,其特征在于,所述步骤C包括:
对已知的软件漏洞样本进行分析总结,抽象出漏洞特征,用Promela语言描述漏洞特征,建立漏洞模型;
采用代码插桩技术,将所述漏洞模型插入到所述Promela模型中。
6.根据权利要求1所述的二进制程序漏洞挖掘方法,其特征在于,所述步骤D中引入外部C代码修补SPIN包括步骤:
预先设置外部C代码,来构建执行所述Promela模型必要的系统资源、维护临时状态、处理SPIN无法处理的BIL中的表达式和关键字以及处理BAP无法解析的汇编指令;
所述步骤D中基于修补后的SPIN模拟执行所述Promela模型,检测漏洞包括步骤:
将Promela模型转化为C代码程序;
使用编译器将转化后的C代码和外部C代码联合编译成一个可执行程序;
执行编译好的可执行程序进行模型检测。
7.一种二进制程序漏洞挖掘系统,其特征在于,包括预处理模块、代码转化模块和模型检测模块;
所述预处理模块,用于采用反编译器IDA将二进制程序转化为汇编语言,并基于IDA进行汇编语言层次的静态分析得到函数流图;
所述代码转化模块,用于通过中间语言平台BAP将所述汇编语言转化为BIL语言,并结合静态分析的分析结果对所述BIL语言进行Promela模型建模;构建漏洞模型插入到所述Promela模型中;
所述模型检测模块,用于引入外部C代码修补SPIN,并基于修补后的SPIN模拟执行所述Promela模型,检测漏洞;输出检测结果和漏洞信息。
8.根据权利要求7所述的二进制程序漏洞挖掘系统,其特征在于,所述代码转化模块,用于:
依据静态分析得出的函数流图,对BIL代码进行程序切片切分成BIL语句;进行从切分后得到的BIL语句到Promela语句的细粒度代码转化;将经过细粒度代码转化后的Promela语句构建、组装成Promela模型;对已知的软件漏洞样本进行分析总结,抽象出漏洞特征,用Promela语言描述漏洞特征,建立漏洞模型;采用代码插桩技术,将所述漏洞模型插入到所述Promela模型中。
9.根据权利要求8所述的二进制程序漏洞挖掘系统,其特征在于,所述代码转化模块,用于:
依据静态分析的函数流图,以sub函数为单位,将BIL代码切分成不同函数片断;对BIL代码中的汇编指令进行多维度匹配,将所述函数片断切分成指令集;对BIL语句的完备性进行检验,以将BIL指令集切分成BIL语句;
预先对BIL语句的各种特征进行总结,并构建BIL语句的特征池将其置于特征池中;将待转化的BIL语句与所述特征池中的特征进行匹配;将匹配后的BIL语句转化为符合Promela中嵌C语法的Promela语句。
10.根据权利要求7所述的二进制程序漏洞挖掘系统,其特征在于,所述模型检测模块,用于:
预先设置外部C代码,来构建执行所述Promela模型必要的系统资源、维护临时状态、处理SPIN无法处理的BIL中的表达式和关键字以及处理BAP无法解析的汇编指令;将Promela模型转化为C代码程序;使用编译器将转化后的C代码和外部C代码联合编译成一个可执行程序;执行编译好的可执行程序进行模型检测。
CN201511025350.4A 2015-12-30 2015-12-30 一种二进制程序漏洞挖掘方法和系统 Active CN105678169B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201511025350.4A CN105678169B (zh) 2015-12-30 2015-12-30 一种二进制程序漏洞挖掘方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201511025350.4A CN105678169B (zh) 2015-12-30 2015-12-30 一种二进制程序漏洞挖掘方法和系统

Publications (2)

Publication Number Publication Date
CN105678169A true CN105678169A (zh) 2016-06-15
CN105678169B CN105678169B (zh) 2019-02-26

Family

ID=56189843

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201511025350.4A Active CN105678169B (zh) 2015-12-30 2015-12-30 一种二进制程序漏洞挖掘方法和系统

Country Status (1)

Country Link
CN (1) CN105678169B (zh)

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106407104A (zh) * 2016-08-24 2017-02-15 北京奇虎测腾安全技术有限公司 一种用于检测与内存空间释放相关的缺陷的方法及系统
CN106598839A (zh) * 2016-10-31 2017-04-26 华东师范大学 一种面向目标代码的程序静态分析方法
CN106649095A (zh) * 2016-10-31 2017-05-10 华东师范大学 一种面向目标代码的程序静态分析系统
CN107154929A (zh) * 2017-03-31 2017-09-12 武汉斗鱼网络科技有限公司 一种直播软件的测试方法及装置
CN107657177A (zh) * 2017-09-30 2018-02-02 北京奇虎科技有限公司 一种漏洞检测方法及装置
CN107944278A (zh) * 2017-12-11 2018-04-20 北京奇虎科技有限公司 一种内核漏洞检测方法及装置
CN109308415A (zh) * 2018-09-21 2019-02-05 四川大学 一种面向二进制的导向性模糊测试方法与系统
CN109508537A (zh) * 2018-09-21 2019-03-22 中国科学院信息工程研究所 检测堆栈中返回地址被篡改的方法及装置
CN109710226A (zh) * 2018-09-06 2019-05-03 天翼电子商务有限公司 一种编译器后端指令选择学习系统及具有该系统的编译器和指令选择方法
CN110647457A (zh) * 2018-06-26 2020-01-03 阿里巴巴集团控股有限公司 数据挖掘方法、数据处理方法和系统
CN111523121A (zh) * 2019-12-24 2020-08-11 国网天津市电力公司 一种指引二进制漏洞挖掘路径的方法及其应用
CN111651773A (zh) * 2020-08-05 2020-09-11 成都无糖信息技术有限公司 一种二进制安全漏洞自动化挖掘方法
CN112134761A (zh) * 2020-09-23 2020-12-25 国网四川省电力公司电力科学研究院 基于固件分析的电力物联网终端脆弱性检测方法及系统
CN112163218A (zh) * 2020-08-13 2021-01-01 中国人民解放军战略支援部队信息工程大学 一种基于代码注入的反漏洞挖掘方法及装置
CN112199282A (zh) * 2020-10-09 2021-01-08 杭州安恒信息技术股份有限公司 一种office软件的模糊测试方法、装置及设备
CN112199685A (zh) * 2020-09-25 2021-01-08 浙江大学计算机创新技术研究院 一种基于架构相似性的智能终端设备衍生漏洞挖掘方法
JP2021082256A (ja) * 2019-11-20 2021-05-27 ▲広▼州大学 動的ステイン分析に基づくメモリ分析方法及び装置
CN113051582A (zh) * 2021-04-28 2021-06-29 重庆电子工程职业学院 一种计算机软件技术开发调试系统
CN113312891A (zh) * 2021-04-22 2021-08-27 北京墨云科技有限公司 一种基于生成模型的payload自动生成方法、装置、系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673198A (zh) * 2009-03-06 2010-03-17 华东师范大学 一种验证uml模型中动态行为与时序契约的一致性的方法
CN101714118A (zh) * 2009-11-20 2010-05-26 北京邮电大学 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法
CN102841844A (zh) * 2012-07-13 2012-12-26 北京航空航天大学 一种基于简易符号执行的二进制代码漏洞挖掘方法
CN104135397A (zh) * 2014-07-01 2014-11-05 浙江工业大学 面向无线传感网安全协议设计与实现的形式化验证方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673198A (zh) * 2009-03-06 2010-03-17 华东师范大学 一种验证uml模型中动态行为与时序契约的一致性的方法
CN101714118A (zh) * 2009-11-20 2010-05-26 北京邮电大学 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法
CN102841844A (zh) * 2012-07-13 2012-12-26 北京航空航天大学 一种基于简易符号执行的二进制代码漏洞挖掘方法
CN104135397A (zh) * 2014-07-01 2014-11-05 浙江工业大学 面向无线传感网安全协议设计与实现的形式化验证方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
王大伟等: "一种自动化模型检测ANSI-C程序的实用方法", 《计算机工程与科学》 *

Cited By (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106407104B (zh) * 2016-08-24 2018-12-04 北京奇虎测腾安全技术有限公司 一种用于检测与内存空间释放相关的缺陷的方法及系统
CN106407104A (zh) * 2016-08-24 2017-02-15 北京奇虎测腾安全技术有限公司 一种用于检测与内存空间释放相关的缺陷的方法及系统
CN106598839A (zh) * 2016-10-31 2017-04-26 华东师范大学 一种面向目标代码的程序静态分析方法
CN106649095A (zh) * 2016-10-31 2017-05-10 华东师范大学 一种面向目标代码的程序静态分析系统
CN107154929A (zh) * 2017-03-31 2017-09-12 武汉斗鱼网络科技有限公司 一种直播软件的测试方法及装置
CN107657177B (zh) * 2017-09-30 2020-11-06 北京奇虎科技有限公司 一种漏洞检测方法及装置
CN107657177A (zh) * 2017-09-30 2018-02-02 北京奇虎科技有限公司 一种漏洞检测方法及装置
CN107944278A (zh) * 2017-12-11 2018-04-20 北京奇虎科技有限公司 一种内核漏洞检测方法及装置
CN110647457B (zh) * 2018-06-26 2023-03-28 阿里巴巴集团控股有限公司 数据挖掘方法、数据处理方法和系统
CN110647457A (zh) * 2018-06-26 2020-01-03 阿里巴巴集团控股有限公司 数据挖掘方法、数据处理方法和系统
CN109710226A (zh) * 2018-09-06 2019-05-03 天翼电子商务有限公司 一种编译器后端指令选择学习系统及具有该系统的编译器和指令选择方法
CN109308415A (zh) * 2018-09-21 2019-02-05 四川大学 一种面向二进制的导向性模糊测试方法与系统
CN109508537A (zh) * 2018-09-21 2019-03-22 中国科学院信息工程研究所 检测堆栈中返回地址被篡改的方法及装置
CN109308415B (zh) * 2018-09-21 2021-11-19 四川大学 一种面向二进制的导向性模糊测试方法与系统
JP2021082256A (ja) * 2019-11-20 2021-05-27 ▲広▼州大学 動的ステイン分析に基づくメモリ分析方法及び装置
CN111523121A (zh) * 2019-12-24 2020-08-11 国网天津市电力公司 一种指引二进制漏洞挖掘路径的方法及其应用
CN111523121B (zh) * 2019-12-24 2023-08-29 国网天津市电力公司 一种指引二进制漏洞挖掘路径的方法及其应用
CN111651773B (zh) * 2020-08-05 2020-11-06 成都无糖信息技术有限公司 一种二进制安全漏洞自动化挖掘方法
CN111651773A (zh) * 2020-08-05 2020-09-11 成都无糖信息技术有限公司 一种二进制安全漏洞自动化挖掘方法
CN112163218B (zh) * 2020-08-13 2022-11-15 中国人民解放军战略支援部队信息工程大学 一种基于代码注入的反漏洞挖掘方法及装置
CN112163218A (zh) * 2020-08-13 2021-01-01 中国人民解放军战略支援部队信息工程大学 一种基于代码注入的反漏洞挖掘方法及装置
CN112134761A (zh) * 2020-09-23 2020-12-25 国网四川省电力公司电力科学研究院 基于固件分析的电力物联网终端脆弱性检测方法及系统
CN112199685A (zh) * 2020-09-25 2021-01-08 浙江大学计算机创新技术研究院 一种基于架构相似性的智能终端设备衍生漏洞挖掘方法
CN112199685B (zh) * 2020-09-25 2024-04-19 浙江大学计算机创新技术研究院 一种基于架构相似性的智能终端设备衍生漏洞挖掘方法
CN112199282A (zh) * 2020-10-09 2021-01-08 杭州安恒信息技术股份有限公司 一种office软件的模糊测试方法、装置及设备
CN113312891A (zh) * 2021-04-22 2021-08-27 北京墨云科技有限公司 一种基于生成模型的payload自动生成方法、装置、系统
CN113312891B (zh) * 2021-04-22 2022-08-26 北京墨云科技有限公司 一种基于生成模型的payload自动生成方法、装置、系统
CN113051582A (zh) * 2021-04-28 2021-06-29 重庆电子工程职业学院 一种计算机软件技术开发调试系统
CN113051582B (zh) * 2021-04-28 2023-03-14 重庆电子工程职业学院 一种计算机软件技术开发调试系统

Also Published As

Publication number Publication date
CN105678169B (zh) 2019-02-26

Similar Documents

Publication Publication Date Title
CN105678169A (zh) 一种二进制程序漏洞挖掘方法和系统
CN109426723B (zh) 使用释放后内存的检测方法、系统、设备及存储介质
CN107832619B (zh) Android平台下应用程序漏洞自动化挖掘系统及方法
Gross et al. Search-based system testing: high coverage, no false alarms
CN101714118B (zh) 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法
Feldthaus et al. Semi-automatic rename refactoring for JavaScript
US20140208431A1 (en) Automated tools for building secure software programs
CN104573503B (zh) 一种内存访问溢出的检测方法及装置
KR20090071596A (ko) 모델 검사를 병용하기 위한 전이 시스템 생성 방법
CN101814053A (zh) 一种基于功能模型的二进制代码漏洞发现方法
Delahaye et al. A comparison of mutation analysis tools for java
CN104090798A (zh) 动静态结合的中断驱动程序数据竞争检测方法
Lin et al. Graph-based seed object synthesis for search-based unit testing
Ko et al. Weakly sensitive analysis for JavaScript object‐manipulating programs
Jeon et al. Automated crash filtering using interprocedural static analysis for binary codes
US20140289712A1 (en) Effective Lifetime Dependency Analysis and Typestate Analysis
Cassez et al. Wuppaal: Computation of worst-case execution-time for binary programs with uppaal
Zhang et al. Unit test data generation for c using rule-directed symbolic execution
Ponomarenko et al. A combined technique for automatic detection of backward binary compatibility problems
Lindner et al. Proof-producing symbolic execution for binary code verification
US10445078B2 (en) Layered software architecture model for translation of assembler language to target language
Ponomarenko et al. Automatic backward compatibility analysis of software component binary interfaces
JP2002515996A (ja) シミュレートされたプログラムの実行エラーの検出方法および装置
Chatterjee et al. A low-level memory model and an accompanying reachability predicate
Calvagna et al. Assessing the correctness of JVM implementations

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant