CN105138914B - 一种针对代码复用编程的软件安全性检测方法 - Google Patents
一种针对代码复用编程的软件安全性检测方法 Download PDFInfo
- Publication number
- CN105138914B CN105138914B CN201510467987.2A CN201510467987A CN105138914B CN 105138914 B CN105138914 B CN 105138914B CN 201510467987 A CN201510467987 A CN 201510467987A CN 105138914 B CN105138914 B CN 105138914B
- Authority
- CN
- China
- Prior art keywords
- code
- basic function
- attack
- code snippet
- current
- 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.)
- Expired - Fee Related
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 22
- 230000000694 effects Effects 0.000 claims abstract description 99
- 238000012360 testing method Methods 0.000 claims abstract description 33
- 230000006870 function Effects 0.000 claims description 240
- 239000012634 fragment Substances 0.000 claims description 83
- 230000014509 gene expression Effects 0.000 claims description 21
- 238000000034 method Methods 0.000 claims description 18
- 238000003379 elimination reaction Methods 0.000 claims description 8
- 230000008030 elimination Effects 0.000 claims description 7
- 230000006399 behavior Effects 0.000 claims description 6
- 238000012549 training Methods 0.000 claims description 5
- 238000013475 authorization Methods 0.000 claims description 4
- 238000004088 simulation Methods 0.000 claims description 4
- 235000013399 edible fruits Nutrition 0.000 claims description 3
- 238000006243 chemical reaction Methods 0.000 claims description 2
- 239000012141 concentrate Substances 0.000 claims description 2
- 238000012986 modification Methods 0.000 claims description 2
- 230000004048 modification Effects 0.000 claims description 2
- 238000011017 operating method Methods 0.000 claims 9
- 230000000977 initiatory effect Effects 0.000 claims 1
- 230000008569 process Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 3
- 238000002347 injection Methods 0.000 description 2
- 239000007924 injection Substances 0.000 description 2
- 239000000243 solution Substances 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000002457 bidirectional effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000014616 translation Effects 0.000 description 1
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/562—Static detection
- G06F21/563—Static detection by source code analysis
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)
- Debugging And Monitoring (AREA)
Abstract
针对代码复用编程的软件安全性检测方法,包括指令序列反汇编、收集基本功能代码片段、攻击代码生成、攻击代码记录和软件安全性报告五个阶段;指令序列反汇编阶段,对返回指令之前的字节序列进行反汇编;基本功能代码片段收集阶段,其输入为上一阶段收集的指令序列;判断指令序列是否属于某种基本功能,对于属于基本功能的指令序列,将其作为该基本功能的代码片段进行收集;攻击代码生成阶段,按照预定义的攻击模板组合各基本功能的代码片段,生成攻击代码,对于攻击代码中包含副作用的代码片段,采用副作用消除策略消除其副作用,确保攻击代码功能的正常实现;攻击代码记录阶段,将成功消除副作用的攻击代码记录到相应的测试结果文件中。
Description
技术领域
本发明涉及软件安全性检测,特别涉及一种检测软件是否易受到代码复用编程攻击的软件安全性检测方法。
背景技术
目前针对软件的攻击方式呈现多样化和自动化的特点,使得***和软件安全受到严重的挑战。随着数据执行保护和地址随机化等防御措施在操作***上的部署,传统的代码注入攻击不再有效。而代码复用编程不需要注入攻击代码,通过对目标程序中存在的代码片段进行复用从而实施攻击,可以绕过这些安全防御技术,对计算机***安全造成了严重的威胁。因此,对软件进行针对代码复用编程的安全性检测具有十分现实的意义,可以有效地缓解代码复用编程的攻击,提高软件的安全质量。
本发明提出一种针对代码复用编程的软件安全性检测方法。收集待检测程序中存在的代码片段,根据多种组合规则组合代码片段生成攻击代码,实现多种攻击行为的检测,多方面检测软件的安全性。在攻击代码生成过程中,加入对带有副作用代码片段(会对程序状态产生额外操作)的使用,提高了生成攻击代码的成功率,从而更为全面和准确地检测软件被利用或攻击的可能性,提高针对代码复用编程的软件安全性。
发明内容
为了更加有效地生成攻击代码、检测针对代码复用编程的软件安全性,本发明目的是,提供一种引入副作用代码片段、针对代码复用编程的软件安全性进行检测的方法。收集待检测程序中存在的多种基本功能的代码片段,将这些收集到的代码片段作为攻击代码生成的候选集;根据预定义的多种攻击模板(即代码片段组合规则)组合候选集中的各基本功能代码片段,生成攻击代码;记录生成的各攻击代码,报告待检测程序中存在的安全隐患。通过在攻击代码生成过程中引入副作用代码片段,从而有效地提高了攻击代码生成成功率,提高了安全性检测的精确度。
本发明技术方案是:一种针对代码复用编程的软件安全性检测方法,包括指令序列反汇编、收集基本功能代码片段、攻击代码生成、攻击代码记录和软件安全性报告等5个阶段。指令序列反汇编阶段,对返回指令之前的字节序列进行反汇编。由于x86平台指令的密集性,一个字节序列可能对应多种反汇编结果,即多个指令序列。基本功能代码片段收集阶段,其输入为上一阶段收集的指令序列。判断指令序列是否属于某种基本功能。对于属于基本功能的指令序列,将其作为该基本功能的代码片段进行收集。攻击代码生成阶段,按照预定义的攻击模板组合各基本功能的代码片段,生成攻击代码。对于攻击代码中包含副作用的代码片段,采用副作用消除策略消除其副作用,确保攻击代码功能的正常实现。攻击代码记录阶段,将成功消除副作用的攻击代码记录到相应的测试结果文件中。软件安全性报告阶段,输出各测试结果文件中记录的攻击代码,报告用户待检测程序中潜在的可实现各种攻击行为的复用代码(即攻击代码),以评价软件潜在的安全隐患。
本发明的关键操作如下:
(1)返回指令的搜索。在待检测程序的可执行段中搜索存在的返回指令;
(2)字节序列反汇编。对返回指令之前的字节序列进行逆向反汇编,直到反汇编完成。反汇编结果为多个指令序列;
(3)基本功能代码片段收集。本发明中预定义了多种基本功能。对于收集到的指令序列,采用语义求解器求解验证其是否属于某种基本功能。如果属于,将指令序列作为该基本功能的代码片段收集,每个基本功能对应一个代码片段集;
(4)代码片段分配。本发明中预定义了多种攻击模板,攻击模板由基本功能语句构成,每条基本功能语句存在相应的基本功能代码片段集。遍历各个攻击模板,对于攻击模板中的每条基本功能语句,从对应的基本功能代码片段集中搜索操作数匹配的代码片段。每条基本功能语句对应多个匹配的代码片段,这些代码片段组成该基本功能语句的分配代码片段集。
(5)攻击代码生成。遍历攻击模板中的各条基本功能语句,从每条基本功能语句的分配代码片段集中选择一个代码片段。这些选择的代码片段的每种组合,构成一个攻击代码。由于每条基本功能语句的分配代码片段集中包含多个代码片段,所以攻击代码存在多种代码片段组合方式,即每个攻击模板可生成多个攻击代码。其中,要使用副作用判断、定义-使用链收集、副作用消除和攻击代码记录等操作;
(6)副作用判断。遍历攻击代码中的代码片段,通过定义-使用链判断各代码片段是否带有副作用;
(7)定义-使用链收集。分析攻击代码中各代码片段之间的数据流,收集攻击代码中存在的定义-使用链;
(8)副作用消除。针对攻击代码中存在的副作用代码片段,采用引入基本功能的代码片段对其副作用进行消除,从而保证攻击代码正常执行;
(9)攻击代码记录。将成功消除副作用的攻击代码的详细信息记录到对应的测试结果文件中。
(10)软件安全性报告。输出各测试结果文件中的攻击代码,报告用户待检测程序中潜在的代码复用威胁以及各类攻击行为在待检测程序中实现的可能,有效检测软件存在的安全隐患。
本发明的有益效果是,在判断代码片段是否属于特定基本功能时采用语义求解器求解的方法,避免人工分析复杂指令序列,可以收集到人工无法收集到的代码片段,提高了基本功能代码片段收集的数量。在攻击代码生成阶段,引入副作用代码片段并给出消除副作用策略消除其副作用,提高了攻击代码生成成功率。定义的攻击模板涵盖了多种攻击行为,从多方面检测软件存在的针对代码复用攻击的安全隐患。相较于以往的技术,本发明能更为精确地检测出软件中存在的代码复用编程类的安全隐患,以便通过改进编程提高软件安全质量。
附图说明
图1针对代码复用编程的软件安全性检测流程图;
图2返回指令搜索流程图;
图3字节序列反汇编流程图;
图4基本功能代码片段收集流程图;
图5代码片段分配流程图;
图6攻击代码生成流程图;
图7副作用判断流程图;
图8定义-使用链收集流程图;
图9副作用消除流程图;
图10攻击代码记录流程图;
图11软件安全性报告流程图。
具体实施方法
图1为本软件安全性检测方法的总体流程图。本方法的输入是待检测程序,输出是待检测程序中潜在的可被攻击者利用的攻击代码。首先在待检测程序的可执行段中收集各基本功能的代码片段;然后根据预定义的攻击模板组合收集到的各基本功能代码片段,生成攻击代码;由于在攻击代码生成过程中加入副作用代码片段,所以在攻击代码生成后需要对攻击代码中副作用代码片段采用副作用消除策略进行副作用消除;如果攻击代码中代码片段副作用消除成功,则该攻击代码可用,记录到对应的测试结果文件中;最后输出各测试结果文件中的攻击代码,报告用户待检测程序中存在的复用代码编程安全隐患。
图2为返回指令搜索的流程图,搜索待检测程序的可执行段中存在的返回指令。使用如下数据结构:ELF文件头数据结构,描述整个文件的基本属性,其中成员变量程序头表偏移是程序头表在文件中的偏移值;程序头表,以数组形式存储程序头数据结构;程序头数据结构,描述程序各个段信息,包含权限属性(可读、可写和可执行)、程序头偏移和程序头大小等成员变量。
步骤20为初始动作。步骤21从程序ELF文件头中获取程序头表偏移。步骤22从程序头表中按顺序取程序头为当前程序头。步骤23判断当前程序头是否是可执行段,即程序头结构体中权限属性是否等于可执行。如果是,跳转到步骤24;否则跳转到步骤22。步骤24将当前程序头中的程序头偏移赋值给可执行段起始偏移,将程序头偏移和程序头大小的和赋值给可执行段结束偏移。步骤25设置指针初始化为可执行段的起始偏移。步骤26判断指针指向的字节是否是返回指令。如果是,跳转到步骤27;否则跳转到步骤28。步骤27对返回指令之前的字节序列进行反汇编操作,收集指令序列。具体流程如图3所示,输入为返回指令之前的字节序列。步骤28设置指针偏移到下一个字节。步骤29判断指针偏移是否大于可执行段结束偏移。如果是,跳转到步骤2a;否则跳转到步骤26。步骤2a为结束状态。
图3为字节序列反汇编的流程图,对返回指令之前的字节序列进行反汇编。输入是返回指令之前的字节序列。输出是反汇编后收集到的指令序列。因为x86平台指令的密集性,字节序列对应多种反汇编指令序列结果,采用树状结构进行存储。使用如下数据结构:指令的数据结构,基于LIBDASM中INSTRUCTION结构体的数据结构,用以存储反汇编指令的指令信息,主要包含指令类型、源操作数集合和目的操作数集合等成员变量。其中,源操作数集合包含指令使用的所有源操作数,用链表形式存储;目的操作数集合包含指令修改的所有目的操作数,用链表形式存储。操作数的数据结构,基于LIBDASM中OPERAND结构体的数据结构,用以存储指令的操作数信息,主要包含操作数类型、寻址方式、操作数权限和操作数大小等成员变量。其中操作数类型包含寄存器、内存和立即数;操作数权限包含读、写和执行。树状结构中节点的数据结构,主要包含指令、指令偏移、父节点指针和子节点指针数组等成员变量。指令以指令数据结构存储;父节点指针指向父节点、子节点指针数组包含的每个指针指向子节点。在反汇编过程中,设置指令最长字节数为20。本发明采用LIBDASM反汇编器对字节序列进行反汇编。LIBDASM提供接口函数get_instruction函数,将反汇编后指令信息存储在INSTRUCTION结构体中。输入是输入字节序列和INSTRUCTION结构体,输出是指令字节数,0表示字节序列无法反汇编为有效指令。
步骤30为初始动作。步骤31创建节点数据结构,初始化成员变量指令为返回指令,指令偏移为返回指令在可执行段中偏移。设置其为树状结构的根节点并将该节点加入到队列中。步骤32从队列中取出队首节点为当前节点。步骤33设置变量pos初始化相对偏移为当前节点在可执行段中的偏移,设置变量len为1。步骤34判断len是否大于指令最长字节数。如果是,跳转到步骤39;否则跳转到步骤35。步骤35使用LIBDASM进行反汇编,反汇编范围为从偏移(pos-len)到(pos-1)的字节序列。步骤36根据get_instruction函数返回结果判断字节序列是否是有效指令。如果是,跳转到步骤37;否则跳转到步骤38。步骤37对字节序列反汇编结果使用指令的数据结构进行存储,并创建节点数据结构加入到当前节点的子节点中。然后将新节点加入到队列中。步骤38对len进行加1操作,然后跳转到步骤34重新执行步骤34动作。步骤39判断队列是否为空。如果是,跳转到步骤3a;否则跳转到步骤32。步骤3a为结束状态。
图4为收集基本功能代码片段的流程图,判断指令序列是否属于基本功能并对属于基本功能的指令序列收集为相应基本功能的代码片段。输入是指令序列和基本功能表。执行完毕后代码片段被收集到各个基本功能对应的代码片段链表中。代码片段是以返回指令结尾的指令序列。程序状态={通用寄存器,段寄存器,指令寄存器,内存}。使用如下数据结构:基本功能表,以数组形式存储各个预定义的基本功能。基本功能的数据结构,用以描述基本功能的信息,主要包含基本功能类别、基本功能表达式、源操作数类型、目的操作数类型和代码片段链表等成员变量。其中,基本功能类别包含寄存器赋值、寄存器间传值、读内存、写内存、寄存器间算术逻辑操作、目的操作数为内存的算术逻辑操作、源操作数为内存的算术逻辑操作、标志位设置、控制流转移、***调用;基本功能表达式是以表达式的形式描述该基本功能的操作;源操作数类型是该基本功能表达式中源操作数类型;目的操作数类型是该基本功能表达式中目的操作数类型;代码片段链表存储满足该基本功能的代码片段。代码片段的数据结构,用以存储各个基本功能的代码片段,主要包含指令序列、基本功能类别、功能输入操作数、功能输出操作数和地址等成员变量。其中,指令序列中的每条指令采用指令数据结构存储;功能输出操作数是基本功能表达式的目的操作数,以操作数数据结构存储;功能输入操作数是基本功能表达式的源操作数,以操作数数据结构存储;地址是该代码片段在待检测程序中的地址。
在判断指令序列是否属于基本功能的过程中使用二进制分析平台BAP中TOIL和TOPREDICATE工具以及Z3求解器(本发明中选取的语义求解器)。TOIL实现将指令的字节表示转化为BAP中间表示语言BIL。BIL采用SSA格式,描述指令执行的操作。TOIL输入是ELF文件、指令的起始地址和结束地址,输出是指令的BIL格式文件。TOPREDICATE实现将BIL格式文件转化为SMT-LIB2语言。SMT-LIB2是SMT求解器通用的输入格式,涵盖赋值、算术和逻辑等操作。TOPREDICATE输入是BIL格式文件以及自定义的后置条件,输出是转化的SMT-LIB2格式文件。Z3求解器实现对SMT-LIB2格式文件的求解。输入是SMT-LIB2格式文件,输出是有效、无效以及不确定三种状态之一。XEN中emulate函数实现对指令的模拟执行。输入是指令执行前的程序状态,输出是指令执行后的程序状态。在XEN中,程序状态以x86_emulate_ctxt结构体存储。
步骤40为初始动作。步骤41从基本功能表中按顺序取基本功能为当前基本功能。步骤42使用rand函数产生随机值赋值给程序状态输入中的各寄存器和内存成员变量。步骤43通过XEN中emulate函数对指令序列模拟执行,得到指令序列执行后的程序状态输出。步骤44检测程序状态输入和程序状态输出的成员变量是否满足当前基本功能的基本功能表达式。如果是,跳转到步骤45;否则跳转到步骤49。步骤45通过BAP中工具TOIL将指令序列的字节流转化为BIL中间表示语言,同时为当前基本功能的基本功能表达式生成BIL表示。步骤46通过BAP中工具TOPREDICATE将指令序列和基本功能表达式的BIL表示转化为SMT-LIB2。步骤47判断指令序列和当前基本功能的基本功能表达式是否存在等价性,即Z3输出的结果是否为有效。如果是,跳转到步骤48;否则跳转到步骤49。步骤48创建代码片段数据结构存储代码片段,并加入到当前基本功能的代码片段链表中。步骤49判断基本功能表是否已取完。如果是,跳转到步骤4a;否则跳转到步骤41。步骤4a为结束状态。
图5为代码片段分配的流程图,为攻击模板中的各基本功能语句分配匹配的代码片段。输入是敏感操作和基本功能表。执行完毕后代码片段被分配到攻击模板中各基本功能语句的分配代码片段链表中。敏感操作是攻击者编写复用代码意图实现的攻击行为,本发明预设任意内存写、函数调用和***调用三种敏感操作,即敏感操作集={内存写,函数调用,***调用}。每个敏感操作对应多个预定义的攻击模板。攻击模板由基本功能语句编写,是基本功能语句序列。使用以下数据结构:敏感操作表,以数组形式存储各个敏感操作;敏感操作的数据结构,包含攻击模板链表和敏感操作名称成员变量。其中,攻击模板链表用以存储敏感操作对应的各个攻击模板,敏感操作名称为敏感操作集中的成员。攻击模板的数据结构,包含基本功能语句链表。其中,基本功能语句链表存储基本功能语句序列。基本功能语句的数据结构,主要包含基本功能类别、功能输入操作数和功能输出操作数、分配代码片段链表和指向下一个基本功能语句指针等成员变量。其中,分配代码片段链表存储与基本功能语句相匹配的代码片段。
步骤50为开始动作。步骤51从敏感操作的攻击模板链表中取第一个攻击模板为当前攻击模板。步骤52从当前攻击模板的基本功能语句链表中取第一个基本功能语句为当前基本功能语句。步骤53从基本功能表中按顺序取基本功能为当前基本功能。步骤54判断当前基本功能语句和当前基本功能的基本功能类别是否相同。如果是,跳转到步骤56;否则跳转到步骤55。步骤55判断基本功能表是否取完。如果是,跳转到步骤5f;否则跳转到步骤53。步骤56从当前基本功能的代码片段链表中取第一个代码片段为当前代码片段。步骤57判断当前代码片段的功能输出操作数是否与基本功能语句功能输出操作数相同。如果是,跳转到步骤58;否则跳转到步骤5a。步骤58判断当前代码片段的功能输入操作数是否与基本功能语句功能输入操作数相同。如果是,跳转到步骤59;否则跳转到步骤5a。步骤59创建代码片段的数据结构存储当前代码片段,并加入到基本功能语句的分配代码片段链表中。步骤5a从当前基本功能的代码片段链表中取下一个代码片段为当前代码片段。步骤5b判断当前代码片段是否为空。如果是,跳转到步骤5c;否则跳转到步骤57。步骤5c判断当前基本功能语句中的分配代码片段链表是否为空。如果是,跳转到步骤5f;否则跳转到步骤5d。步骤5d从当前攻击模板的基本功能语句链表中取下一个基本功能语句为当前基本功能语句。步骤5e判断当前基本功能语句是否为空。如果是,跳转到步骤5f;否则跳转到步骤52。步骤5f从攻击模板链表中取下一个攻击模板为当前攻击模板。步骤5g判断当前攻击模板是否为空。如果是,跳转到步骤5h;否则跳转到步骤51。步骤5h为结束状态。
图6为攻击代码生成的流程图,组合各个基本功能语句对应的代码片段,生成攻击代码。输入是基本功能语句链表、代码片段链表和敏感操作。其中,代码片段链表初始化为空,用以存储攻击模板对应的攻击代码。执行完毕后将攻击代码作为输入进行副作用消除,并将成功消除副作用的攻击代码记录到对应的测试结果文件中。
步骤60为开始动作。步骤61判断输入的基本功能语句链表是否为空。如果是,跳转到步骤6a;否则跳转到步骤62。步骤62从基本功能语句链表中取第一个基本功能语句为当前语句。步骤63从当前语句的分配代码片段链表中取第一个代码片段为当前代码片段。步骤64将当前代码片段加入到代码片段链表尾部。步骤65取当前语句的下一条基本功能语句为后继语句。步骤66对子攻击模板进行攻击代码生成,具体流程如图6所示,参数是以后继语句为起始节点的基本功能语句链表和代码片段链表。步骤67删除代码片段链表尾部的代码片段。步骤68从当前语句的分配代码片段链表中取下一个代码片段为当前代码片段。步骤69判断当前代码片段是否为空。如果是,跳转到步骤6d;否则跳转到步骤64。步骤6a对生成的代码片段链表中的代码片段产生的副作用进行消除,具体流程如图7所示,输入是生成的代码片段链表,输出是是否消除副作用成功。步骤6b根据返回结果判断攻击代码副作用消除是否成功。如果是,跳转到步骤6c;否则跳转到步骤6d。步骤6c对攻击代码进行记录。具体流程如图10所示,输入是成功消除副作用的代码片段链表和敏感操作。步骤6d为结束状态。
图7为副作用判断的流程图,判断攻击代码中各个代码片段是否存在副作用。输入是代码片段链表(即攻击代码)和基本功能表。输出为消除副作用成功或消除副作用失败。步骤70为开始动作。步骤71从代码片段链表中取第一个代码片段为当前代码片段。步骤72从当前代码片段的指令序列中取第一条指令为当前指令。步骤73从定义-使用链链表中取第一个定义-使用链为当前定义-使用链。定义-使用链链表的生成具体流程如图8所示,输入为代码片段链表,输出为定义-使用链链表。步骤74判断当前指令是否破坏当前定义-使用链,即当前指令的目的操作数集合是否包含当前定义-使用链结构体中的操作数。如果是,跳转到步骤75;否则跳转到步骤77。步骤75采用副作用消除策略消除副作用。具体流程如图9所示,输入是当前代码片段、当前定义-使用链、代码片段链表和基本功能表,输出是消除副作用成功或消除副作用失败。步骤76根据副作用消除过程返回的结果判断代码片段副作用是否消除成功。如果是,跳转到步骤77;否则跳转到步骤7d。步骤77从定义-使用链链表中取下一个定义-使用链为当前定义-使用链。步骤78判断当前定义-使用链是否为空。如果是,跳转到步骤79;否则跳转到步骤73。步骤79从当前代码片段指令序列中取下一条指令为当前指令。步骤7a判断当前指令是否为空。如果是,跳转到步骤7b;否则跳转到步骤74。步骤7b从代码片段链表中取下一个代码片段为当前代码片段。步骤7c判断当前代码片段是否为空。如果是,跳转到步骤7d;否则跳转到步骤71。步骤7d为结束状态。
图8为收集定义-使用链的流程图,收集攻击代码中存在的定义-使用链。输入是代码片段链表(即攻击代码),输出是定义-使用链链表。程序状态元素是属于程序状态集合的元素。当程序状态元素是一个代码片段GA的功能输出操作数(GA实现的功能定义了该程序状态元素)并且是GA之后另一个代码片段GB的功能输入操作数(GB实现的功能使用了该程序状态元素),并且该程序状态元素不是GA和GB之间的任意代码片段的功能输出操作数,那么从GA到GB是该程序状态元素的一条定义-使用链。GA是该程序状态元素的定义点,GB是该程序状态元素的使用点。使用如下数据结构:定义-使用链链表,存储收集到的定义-使用链。定义-使用链的数据结构,主要包括定义点代码片段、使用点代码片段和程序状态元素。步骤80为初始动作。步骤81从代码片段链表中取第一个代码片段为当前代码片段。步骤82从以当前代码片段下一个代码片段为起始节点的子链表中取第一个当前代码片段为后继代码片段。步骤83判断后继代码片段是否为空。如果是,跳转到步骤89;否则跳转到步骤84。步骤84判断当前代码片段功能输出操作数是否与后继代码片段功能输出操作数相同。如果是,跳转到步骤89;否则跳转到步骤85。步骤85判断后继代码片段的功能输入操作数集合是否包含当前代码片段功能输出操作数。如果是,跳转到步骤86;否则跳转到步骤87。步骤86创建定义-使用链数据结构,定义点代码片段为当前代码片段,使用点代码片段为后继代码片段,将新的定义-使用链加入到定义-使用链链表尾部。步骤87从以当前代码片段下一个代码片段为起始节点的子链表中取下一个当前代码片段为后继代码片段。步骤88判断后继代码片段是否为空。如果是,跳转到步骤89;否则跳转到步骤84。步骤89从代码片段链表中取下一个代码片段为当前代码片段。步骤8a判断当前代码片段是否为空。如果是,跳转到步骤8b;否则跳转到步骤81。步骤8b为结束状态,定义-使用链收集完毕。
图9为消除副作用的流程图,消除攻击代码中存在副作用的代码片段的副作用。输入是副作用代码片段、定义-使用链、代码片段链表(即攻击代码)和基本功能表。输出是消除副作用成功或消除副作用失败。步骤90为开始动作。步骤91从寄存器赋值功能的代码片段链表中取第一个代码片段为当前代码片段。步骤92判断当前代码片段的功能输出操作数是否与定义-使用链的操作数相同。如果是,跳转到步骤93;否则跳转到步骤96。步骤93将当前代码片段加入到代码片段链表中,***到副作用代码片段后。步骤94判断当前代码片段是否产生副作用。如果是,跳转到步骤95;否则跳转到步骤98,返回副作用消除成功。判断当前代码片段是否产生副作用,具体流程如图7所示,输入是代码片段链表和指向当前代码片段的指针。步骤95将当前代码片段从代码片段链表中删除。步骤96从寄存器赋值功能的代码片段链表中取下一个代码片段为当前代码片段。步骤97判断当前代码片段是否为空。如果是,跳转步骤98,副作用消除失败;否则跳转到步骤91。步骤98为结束状态。
图10为攻击代码记录的流程图,将成功消除副作用的攻击代码记录到相应的测试结果文件中。输入是代码片段链表(即成功消除副作用的攻击代码)和敏感操作。每个敏感操作对应一个测试结果文件(测试结果文件名为相应的敏感操作名),将攻击代码记录到相应的测试结果文件中。步骤100为开始动作。步骤101根据敏感操作的敏感操作名找到对应的敏感操作文件。步骤102从代码片段链表中取第一个代码片段为当前代码片段。步骤103将当前代码片段地址、基本功能类别和指令序列汇编代码写入文件中。步骤104从代码片段链表中取下一个代码片段为当前代码片段。步骤105判断当前代码片段是否为空。如果是,跳转到步骤106;否则跳转到步骤102。步骤106表示结束状态。
图11为软件安全性报告的流程图,输出敏感操作对应的测试结果文件中记录的攻击代码信息。输入是测试结果文件。执行完毕后输出测试结果文件中攻击代码信息。步骤110为开始动作。步骤111输出测试结果文件名,即敏感操作名。步骤112取测试结果文件中的第一行为当前行。步骤113判断当前行是否为空。如果是,跳转到步骤116;否则跳转到步骤114。步骤114输出当前行保存的攻击代码信息。步骤115取测试结果文件中的下一行为当前行。步骤116为结束状态。
Claims (10)
1.一种针对代码复用编程的软件安全性检测方法,其特征是包括指令序列反汇编、基本功能代码片段收集、攻击代码生成、攻击代码记录和软件安全性报告五个阶段;
指令序列反汇编阶段,对返回指令之前的字节序列进行反汇编;
基本功能代码片段收集阶段,其输入为上一阶段收集的指令序列;判断指令序列是否属于某种基本功能,对于属于基本功能的指令序列,将其作为该基本功能的代码片段进行收集;
攻击代码生成阶段,按照预定义的攻击模板组合各基本功能的代码片段,生成攻击代码,对于攻击代码中包含副作用的代码片段,采用副作用消除策略消除其副作用,确保攻击代码功能的正常实现;
攻击代码记录阶段,将成功消除副作用的攻击代码记录到相应的测试结果文件中;
软件安全性报告阶段,输出各测试结果文件中记录的攻击代码,报告用户待检测程序中潜在的可实现各种攻击行为的复用代码即攻击代码,以评价软件潜在的安全隐患;
关键操作步骤如下:
(1)返回指令的搜索,在待检测程序的可执行段中搜索存在的返回指令;
(2)字节序列反汇编,对返回指令之前的字节序列进行逆向反汇编,直到反汇编完成;反汇编结果为多个指令序列;
(3)基本功能代码片段收集,预定义多种基本功能;对于收集到的指令序列,采用语义求解器求解验证其是否属于某种基本功能;如果属于,将指令序列作为该基本功能的代码片段收集,每个基本功能对应一个代码片段集;
(4)代码片段分配;预定义多种攻击模板,攻击模板由基本功能语句构成,每条基本功能语句存在相应的基本功能代码片段集;遍历各个攻击模板,对于攻击模板中的每条基本功能语句,从对应的基本功能代码片段集中搜索操作数匹配的代码片段;每条基本功能语句对应多个匹配的代码片段,这些代码片段组成该基本功能语句的分配代码片段集;
(5)攻击代码生成;遍历攻击模板中的各条基本功能语句,从每条基本功能语句的分配代码片段集中选择一个代码片段;这些选择的代码片段的每种组合,构成一个攻击代码;由于每条基本功能语句的分配代码片段集中包含多个代码片段,所以攻击代码存在多种代码片段组合方式,即每个攻击模板可生成多个攻击代码;其中,要使用副作用判断、定义-使用链收集、副作用消除和攻击代码记录操作;
(6)副作用判断;遍历攻击代码中的代码片段,通过定义-使用链判断各代码片段是否带有副作用;
(7)定义-使用链收集;分析攻击代码中各代码片段之间的数据流,收集攻击代码中存在的定义-使用链;
(8)副作用消除;针对攻击代码中存在的副作用代码片段,采用引入基本功能的代码片段对其副作用进行消除,从而保证攻击代码正常执行;
(9)攻击代码记录;将成功消除副作用的攻击代码的详细信息记录到对应的测试结果文件中;
(10)软件安全性报告;输出各测试结果文件中的攻击代码,报告用户待检测程序中潜在的代码复用威胁以及各类攻击行为在待检测程序中实现的可能,有效检测软件存在的安全隐患。
2.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(1)返回指令的搜索流程中,使用如下数据结构:ELF文件头数据结构,描述整个文件的基本属性,其中成员变量程序头表偏移是程序头表在文件中的偏移值;程序头表,以数组形式存储程序头数据结构;程序头数据结构,描述程序各个段信息,包含可读、可写和可执行权限属性、程序头偏移和程序头大小成员变量;
具体如下:步骤20为初始动作;步骤21从程序ELF文件头中获取程序头表偏移;步骤22从程序头表中按顺序取程序头为当前程序头;步骤23判断当前程序头是否是可执行段,即程序头结构体中权限属性是否等于可执行;如果是,跳转到步骤24;否则跳转到步骤22;步骤24将当前程序头中的程序头偏移赋值给可执行段起始偏移,将程序头偏移和程序头大小的和赋值给可执行段结束偏移;步骤25设置指针初始化为可执行段的起始偏移;步骤26判断指针指向的字节是否是返回指令;如果是,跳转到步骤27;否则跳转到步骤28;步骤27对返回指令之前的字节序列进行反汇编操作,收集指令序列;具体流程如图3所示,输入为返回指令之前的字节序列;步骤28设置指针偏移到下一个字节;步骤29判断指针偏移是否大于可执行段结束偏移;如果是,跳转到步骤2a;否则跳转到步骤26;步骤2a为结束状态;
操作步骤(2)字节序列反汇编的流程中,对返回指令之前的字节序列进行反汇编;输入是返回指令之前的字节序列;输出是反汇编后收集到的指令序列;因为x86平台指令的密集性,字节序列对应多种反汇编指令序列结果,采用树状结构进行存储;使用如下数据结构:指令的数据结构,基于LIBDASM中INSTRUCTION结构体的数据结构,用以存储反汇编指令的指令信息,主要包含指令类型、源操作数集合和目的操作数集合成员变量;其中,源操作数集合包含指令使用的所有源操作数,用链表形式存储;目的操作数集合包含指令修改的所有目的操作数,用链表形式存储;操作数的数据结构,基于LIBDASM中OPERAND结构体的数据结构,用以存储指令的操作数信息,主要包含操作数类型、寻址方式、操作数权限和操作数大小成员变量;其中操作数类型包含寄存器、内存和立即数;操作数权限包含读、写和执行;树状结构中节点的数据结构,主要包含指令、指令偏移、父节点指针和子节点指针数组成员变量;指令以指令数据结构存储;父节点指针指向父节点、子节点指针数组包含的每个指针指向子节点;在反汇编过程中,设置指令最长字节数为20;采用LIBDASM反汇编器对字节序列进行反汇编;LIBDASM提供接口函数get_instruction函数,将反汇编后指令信息存储在INSTRUCTION结构体中;输入是输入字节序列和INSTRUCTION结构体,输出是指令字节数,0表示字节序列无法反汇编为有效指令;
具体如下:步骤30为初始动作;步骤31创建节点数据结构,初始化成员变量指令为返回指令,指令偏移为返回指令在可执行段中偏移;设置其为树状结构的根节点并将该节点加入到队列中;步骤32从队列中取出队首节点为当前节点;步骤33设置变量pos初始化相对偏移为当前节点在可执行段中的偏移,设置变量len为1;步骤34判断len是否大于指令最长字节数;如果是,跳转到步骤39;否则跳转到步骤35;步骤35使用LIBDASM进行反汇编,反汇编范围为从偏移pos-len到pos-1的字节序列;步骤36根据get_instruction函数返回结果判断字节序列是否是有效指令;如果是,跳转到步骤37;否则跳转到步骤38;步骤37对字节序列反汇编结果使用指令的数据结构进行存储,并创建节点数据结构加入到当前节点的子节点中;然后将新节点加入到队列中;步骤38对len进行加1操作,然后跳转到步骤34重新执行步骤34动作;步骤39判断队列是否为空;如果是,跳转到步骤3a;否则跳转到步骤32;步骤3a为结束状态。
3.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(3)收集基本功能代码片段的流程中,判断指令序列是否属于基本功能并对属于基本功能的指令序列收集为相应基本功能的代码片段;输入是指令序列和基本功能表;执行完毕后代码片段被收集到各个基本功能对应的代码片段链表中;代码片段是以返回指令结尾的指令序列;程序状态={通用寄存器,段寄存器,指令寄存器,内存};使用如下数据结构:基本功能表,以数组形式存储各个预定义的基本功能;基本功能的数据结构,用以描述基本功能的信息,包含基本功能类别、基本功能表达式、源操作数类型、目的操作数类型和代码片段链表成员变量;其中,基本功能类别包含寄存器赋值、寄存器间传值、读内存、写内存、寄存器间算术逻辑操作、目的操作数为内存的算术逻辑操作、源操作数为内存的算术逻辑操作、标志位设置、控制流转移、***调用;基本功能表达式是以表达式的形式描述该基本功能的操作;源操作数类型是该基本功能表达式中源操作数类型;目的操作数类型是该基本功能表达式中目的操作数类型;代码片段链表存储满足该基本功能的代码片段;代码片段的数据结构,用以存储各个基本功能的代码片段,主要包含指令序列、基本功能类别、功能输入操作数、功能输出操作数和地址成员变量;其中,指令序列中的每条指令采用指令数据结构存储;功能输出操作数是基本功能表达式的目的操作数,以操作数数据结构存储;功能输入操作数是基本功能表达式的源操作数,以操作数数据结构存储;地址是该代码片段在待检测程序中的地址;
在判断指令序列是否属于基本功能的过程中使用二进制分析平台BAP中TOIL和TOPREDICATE工具以及Z3语义求解器;TOIL实现将指令的字节表示转化为BAP中间表示语言BIL;BIL采用SSA格式,描述指令执行的操作;TOIL输入是ELF文件、指令的起始地址和结束地址,输出是指令的BIL格式文件;TOPREDICATE实现将BIL格式文件转化为SMT-LIB2语言;SMT-LIB2是SMT求解器通用的输入格式,涵盖赋值、算术和逻辑操作;TOPREDICATE输入是BIL格式文件以及自定义的后置条件,输出是转化的SMT-LIB2格式文件;Z3语义求解器实现对SMT-LIB2格式文件的求解;输入是SMT-LIB2格式文件,输出是有效、无效以及不确定三种状态之一;XEN中emulate函数实现对指令的模拟执行;输入是指令执行前的程序状态,输出是指令执行后的程序状态;在XEN中,程序状态以x86_emulate_ctxt结构体存储;
具体如下:步骤40为初始动作;步骤41从基本功能表中按顺序取基本功能为当前基本功能;步骤42使用rand函数产生随机值赋值给程序状态输入中的各寄存器和内存成员变量;步骤43通过XEN中emulate函数对指令序列模拟执行,得到指令序列执行后的程序状态输出;步骤44检测程序状态输入和程序状态输出的成员变量是否满足当前基本功能的基本功能表达式;如果是,跳转到步骤45;否则跳转到步骤49;步骤45通过BAP中工具TOIL将指令序列的字节流转化为BIL中间表示语言,同时为当前基本功能的基本功能表达式生成BIL表示;步骤46通过BAP中工具TOPREDICATE将指令序列和基本功能表达式的BIL表示转化为SMT-LIB2;步骤47判断指令序列和当前基本功能的基本功能表达式是否存在等价性,即Z3输出的结果是否为有效;如果是,跳转到步骤48;否则跳转到步骤49;步骤48创建代码片段数据结构存储代码片段,并加入到当前基本功能的代码片段链表中;步骤49判断基本功能表是否已取完;如果是,跳转到步骤4a;否则跳转到步骤41;步骤4a为结束状态。
4.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(4)代码片段分配的流程,为攻击模板中的各基本功能语句分配匹配的代码片段;输入是敏感操作和基本功能表;执行完毕后代码片段被分配到攻击模板中各基本功能语句的分配代码片段链表中;敏感操作是攻击者编写复用代码意图实现的攻击行为,本发明预设任意内存写、函数调用和***调用三种敏感操作,即敏感操作集={内存写,函数调用,***调用};每个敏感操作对应多个预定义的攻击模板;攻击模板由基本功能语句编写,是基本功能语句序列;使用以下数据结构:敏感操作表,以数组形式存储各个敏感操作;敏感操作的数据结构,包含攻击模板链表和敏感操作名称成员变量;其中,攻击模板链表用以存储敏感操作对应的各个攻击模板,敏感操作名称为敏感操作集中的成员;攻击模板的数据结构,包含基本功能语句链表;其中,基本功能语句链表存储基本功能语句序列;基本功能语句的数据结构,主要包含基本功能类别、功能输入操作数和功能输出操作数、分配代码片段链表和指向下一个基本功能语句指针成员变量;其中,分配代码片段链表存储与基本功能语句相匹配的代码片段;
具体如下,步骤50为开始动作;步骤51从敏感操作的攻击模板链表中取第一个攻击模板为当前攻击模板;步骤52从当前攻击模板的基本功能语句链表中取第一个基本功能语句为当前基本功能语句;步骤53从基本功能表中按顺序取基本功能为当前基本功能;步骤54判断当前基本功能语句和当前基本功能的基本功能类别是否相同;如果是,跳转到步骤56;否则跳转到步骤55;步骤55判断基本功能表是否取完;如果是,跳转到步骤5f;否则跳转到步骤53;步骤56从当前基本功能的代码片段链表中取第一个代码片段为当前代码片段;步骤57判断当前代码片段的功能输出操作数是否与基本功能语句功能输出操作数相同;如果是,跳转到步骤58;否则跳转到步骤5a;步骤58判断当前代码片段的功能输入操作数是否与基本功能语句功能输入操作数相同;如果是,跳转到步骤59;否则跳转到步骤5a;步骤59创建代码片段的数据结构存储当前代码片段,并加入到基本功能语句的分配代码片段链表中;步骤5a从当前基本功能的代码片段链表中取下一个代码片段为当前代码片段;步骤5b判断当前代码片段是否为空;如果是,跳转到步骤5c;否则跳转到步骤57;步骤5c判断当前基本功能语句中的分配代码片段链表是否为空;如果是,跳转到步骤5f;否则跳转到步骤5d;步骤5d从当前攻击模板的基本功能语句链表中取下一个基本功能语句为当前基本功能语句;步骤5e判断当前基本功能语句是否为空;如果是,跳转到步骤5f;否则跳转到步骤52;步骤5f从攻击模板链表中取下一个攻击模板为当前攻击模板;步骤5g判断当前攻击模板是否为空;如果是,跳转到步骤5h;否则跳转到步骤51;步骤5h为结束状态。
5.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(5)攻击代码生成的流程,组合各个基本功能语句对应的代码片段,生成攻击代码;输入是基本功能语句链表、代码片段链表和敏感操作;其中,代码片段链表初始化为空,用以存储攻击模板对应的攻击代码;执行完毕后将攻击代码作为输入进行副作用消除,并将成功消除副作用的攻击代码记录到对应的测试结果文件中;
步骤60为开始动作;步骤61判断输入的基本功能语句链表是否为空;如果是,跳转到步骤6a;否则跳转到步骤62;步骤62从基本功能语句链表中取第一个基本功能语句为当前语句;步骤63从当前语句的分配代码片段链表中取第一个代码片段为当前代码片段;步骤64将当前代码片段加入到代码片段链表尾部;步骤65取当前语句的下一条基本功能语句为后继语句;步骤66对子攻击模板进行攻击代码生成,参数是以后继语句为起始节点的基本功能语句链表和代码片段链表;步骤67删除代码片段链表尾部的代码片段;步骤68从当前语句的分配代码片段链表中取下一个代码片段为当前代码片段;步骤69判断当前代码片段是否为空;如果是,跳转到步骤6d;否则跳转到步骤64;步骤6a对生成的代码片段链表中的代码片段产生的副作用进行消除,输入是生成的代码片段链表,输出是是否消除副作用成功;步骤6b根据返回结果判断攻击代码副作用消除是否成功;如果是,跳转到步骤6c;否则跳转到步骤6d;步骤6c对攻击代码进行记录;输入是成功消除副作用的代码片段链表和敏感操作;步骤6d为结束状态。
6.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(6)副作用判断的流程,判断攻击代码中各个代码片段是否存在副作用;输入是代码片段链表即攻击代码和基本功能表;输出为消除副作用成功或消除副作用失败;步骤70为开始动作;步骤71从代码片段链表中取第一个代码片段为当前代码片段;步骤72从当前代码片段的指令序列中取第一条指令为当前指令;步骤73从定义-使用链链表中取第一个定义-使用链为当前定义-使用链;定义-使用链链表的生成具体流程如图8所示,输入为代码片段链表,输出为定义-使用链链表;步骤74判断当前指令是否破坏当前定义-使用链,即当前指令的目的操作数集合是否包含当前定义-使用链结构体中的操作数;如果是,跳转到步骤75;否则跳转到步骤77;步骤75采用副作用消除策略消除副作用;具体流程:输入是当前代码片段、当前定义-使用链、代码片段链表和基本功能表,输出是消除副作用成功或消除副作用失败;步骤76根据副作用消除过程返回的结果判断代码片段副作用是否消除成功;如果是,跳转到步骤77;否则跳转到步骤7d;步骤77从定义-使用链链表中取下一个定义-使用链为当前定义-使用链;步骤78判断当前定义-使用链是否为空;如果是,跳转到步骤79;否则跳转到步骤73;步骤79从当前代码片段指令序列中取下一条指令为当前指令;步骤7a判断当前指令是否为空;如果是,跳转到步骤7b;否则跳转到步骤74;步骤7b从代码片段链表中取下一个代码片段为当前代码片段;步骤7c判断当前代码片段是否为空;如果是,跳转到步骤7d;否则跳转到步骤71;步骤7d为结束状态。
7.根据权利要求1所述的软件安全性检测方法,其特征是操作(7)定义-使用链链表的生成:输入为代码片段链表,输出为定义-使用链链表;收集定义-使用链的流程中,收集攻击代码中存在的定义-使用链;输入是代码片段链表即攻击代码,输出是定义-使用链链表;程序状态元素是属于程序状态集合的元素;当程序状态元素是一个代码片段GA的功能输出操作数、GA实现的功能定义了该程序状态元素并且是GA之后另一个代码片段GB的功能输入操作数、GB实现的功能使用了该程序状态元素,并且该程序状态元素不是GA和GB之间的任意代码片段的功能输出操作数,那么从GA到GB是该程序状态元素的一条定义-使用链;GA是该程序状态元素的定义点,GB是该程序状态元素的使用点;使用如下数据结构:定义-使用链链表,存储收集到的定义-使用链;定义-使用链的数据结构,主要包括定义点代码片段、使用点代码片段和程序状态元素;
步骤80为初始动作;步骤81从代码片段链表中取第一个代码片段为当前代码片段;步骤82从以当前代码片段下一个代码片段为起始节点的子链表中取第一个当前代码片段为后继代码片段;步骤83判断后继代码片段是否为空;如果是,跳转到步骤89;否则跳转到步骤84;步骤84判断当前代码片段功能输出操作数是否与后继代码片段功能输出操作数相同;如果是,跳转到步骤89;否则跳转到步骤85;步骤85判断后继代码片段的功能输入操作数集合是否包含当前代码片段功能输出操作数;如果是,跳转到步骤86;否则跳转到步骤87;步骤86创建定义-使用链数据结构,定义点代码片段为当前代码片段,使用点代码片段为后继代码片段,将新的定义-使用链加入到定义-使用链链表尾部;步骤87从以当前代码片段下一个代码片段为起始节点的子链表中取下一个当前代码片段为后继代码片段;步骤88判断后继代码片段是否为空;如果是,跳转到步骤89;否则跳转到步骤84;步骤89从代码片段链表中取下一个代码片段为当前代码片段;步骤8a判断当前代码片段是否为空;如果是,跳转到步骤8b;否则跳转到步骤81;步骤8b为结束状态,定义-使用链收集完毕。
8.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(8)消除副作用的流程,消除攻击代码中存在副作用的代码片段的副作用;输入是副作用代码片段、定义-使用链、代码片段链表即攻击代码和基本功能表;输出是消除副作用成功或消除副作用失败;步骤90为开始动作;步骤91从寄存器赋值功能的代码片段链表中取第一个代码片段为当前代码片段;步骤92判断当前代码片段的功能输出操作数是否与定义-使用链的操作数相同;如果是,跳转到步骤93;否则跳转到步骤96;步骤93将当前代码片段加入到代码片段链表中,***到副作用代码片段后;步骤94判断当前代码片段是否产生副作用;如果是,跳转到步骤95;否则跳转到步骤98,返回副作用消除成功;判断当前代码片段是否产生副作用,输入是代码片段链表和指向当前代码片段的指针;步骤95将当前代码片段从代码片段链表中删除;步骤96从寄存器赋值功能的代码片段链表中取下一个代码片段为当前代码片段;步骤97判断当前代码片段是否为空;如果是,跳转步骤98,副作用消除失败;否则跳转到步骤91;步骤98为结束状态。
9.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(9)攻击代码记录的流程中,将成功消除副作用的攻击代码记录到相应的测试结果文件中;输入是代码片段链表、即成功消除副作用的攻击代码和敏感操作;每个敏感操作对应一个测试结果文件、测试结果文件名为相应的敏感操作名,将攻击代码记录到相应的测试结果文件中;步骤100为开始动作;步骤101根据敏感操作的敏感操作名找到对应的敏感操作文件;步骤102从代码片段链表中取第一个代码片段为当前代码片段;步骤103将当前代码片段地址、基本功能类别和指令序列汇编代码写入文件中;步骤104从代码片段链表中取下一个代码片段为当前代码片段;步骤105判断当前代码片段是否为空;如果是,跳转到步骤106;否则跳转到步骤102;步骤106表示结束状态。
10.根据权利要求1所述的软件安全性检测方法,其特征是操作步骤(10)软件安全性报告的流程,输出敏感操作对应的测试结果文件中记录的攻击代码信息;输入是测试结果文件;执行完毕后输出测试结果文件中攻击代码信息;步骤110为开始动作;步骤111输出测试结果文件名,即敏感操作名;步骤112取测试结果文件中的第一行为当前行;步骤113判断当前行是否为空;如果是,跳转到步骤116;否则跳转到步骤114;步骤114输出当前行保存的攻击代码信息;步骤115取测试结果文件中的下一行为当前行;步骤116为结束状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510467987.2A CN105138914B (zh) | 2015-08-03 | 2015-08-03 | 一种针对代码复用编程的软件安全性检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510467987.2A CN105138914B (zh) | 2015-08-03 | 2015-08-03 | 一种针对代码复用编程的软件安全性检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105138914A CN105138914A (zh) | 2015-12-09 |
CN105138914B true CN105138914B (zh) | 2018-02-16 |
Family
ID=54724259
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510467987.2A Expired - Fee Related CN105138914B (zh) | 2015-08-03 | 2015-08-03 | 一种针对代码复用编程的软件安全性检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105138914B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105825086B (zh) * | 2016-03-16 | 2018-07-24 | 西北大学 | 一种基于攻击树的rop防护方法 |
CN110515652B (zh) * | 2019-08-30 | 2021-10-15 | 腾讯科技(深圳)有限公司 | 代码摘要的生成方法、装置和存储介质 |
CN113553041B (zh) * | 2021-09-22 | 2021-12-10 | 武汉江民网安科技有限公司 | 二进制程序中函数代码形式化结构生成方法、设备及介质 |
CN115017507A (zh) * | 2022-07-14 | 2022-09-06 | 北京华云安信息技术有限公司 | 一种检测源代码篡改的方法、装置、设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102662830A (zh) * | 2012-03-20 | 2012-09-12 | 湖南大学 | 一种基于动态二进制翻译框架的代码复用攻击检测*** |
-
2015
- 2015-08-03 CN CN201510467987.2A patent/CN105138914B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102662830A (zh) * | 2012-03-20 | 2012-09-12 | 湖南大学 | 一种基于动态二进制翻译框架的代码复用攻击检测*** |
Non-Patent Citations (1)
Title |
---|
BIOP:自动构造增强型ROP攻击;邢骁 等;《计算机学报》;20140530;第37卷(第5期);正文第1111-1123页 * |
Also Published As
Publication number | Publication date |
---|---|
CN105138914A (zh) | 2015-12-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Quiring et al. | Misleading authorship attribution of source code using adversarial learning | |
CN105138914B (zh) | 一种针对代码复用编程的软件安全性检测方法 | |
Zhong et al. | An empirical study on API usages | |
Fass et al. | Jstap: a static pre-filter for malicious javascript detection | |
Meng et al. | Identifying multiple authors in a binary program | |
Wang et al. | Blended, precise semantic program embeddings | |
Muškardin et al. | AALpy: an active automata learning library | |
CN107367686B (zh) | 一种rtl硬件木马测试向量的生成方法 | |
CN105138335B (zh) | 一种基于控制流图的函数调用路径提取方法及装置 | |
CN106156623B (zh) | 基于意图的sqlia防御方法 | |
CN111475820B (zh) | 基于可执行程序的二进制漏洞检测方法、***及存储介质 | |
CN108595341A (zh) | 测试用例自动生成方法及*** | |
CN109918903A (zh) | 一种基于llvm编译器的程序非控制数据攻击防护方法 | |
CN108563433A (zh) | 一种基于lstm自动补全代码的装置 | |
CN103713933B (zh) | 计算机程序中热点函数、变量的汇聚方法、装置及*** | |
CN106503496A (zh) | 基于操作码替换与合并的Python脚本程序防逆转方法 | |
CN102012987A (zh) | 自动二进制恶意代码行为分析*** | |
CN110245467A (zh) | 基于Dex2C与LLVM的Android应用程序保护方法 | |
CN106055343B (zh) | 一种基于程序演进模型的目标代码逆向工程*** | |
Shrestha et al. | DeepFuzzSL: Generating models with deep learning to find bugs in the Simulink toolchain | |
Chen et al. | Cati: Context-assisted type inference from stripped binaries | |
Abuhamad et al. | Multi-χ: Identifying multiple authors from source code files | |
Meng et al. | Adversarial binaries for authorship identification | |
JP2008299723A (ja) | プログラム検証方法、プログラム検証装置 | |
Rahimian et al. | RESource: a framework for online matching of assembly with open source code |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180216 |