CN105787368A - 一种基于函数置乱的rop防御方法与装置 - Google Patents

一种基于函数置乱的rop防御方法与装置 Download PDF

Info

Publication number
CN105787368A
CN105787368A CN201610109276.2A CN201610109276A CN105787368A CN 105787368 A CN105787368 A CN 105787368A CN 201610109276 A CN201610109276 A CN 201610109276A CN 105787368 A CN105787368 A CN 105787368A
Authority
CN
China
Prior art keywords
function
scramble
instruction
address
data
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.)
Pending
Application number
CN201610109276.2A
Other languages
English (en)
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.)
Wuhan University WHU
Original Assignee
Wuhan University WHU
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 Wuhan University WHU filed Critical Wuhan University WHU
Priority to CN201610109276.2A priority Critical patent/CN105787368A/zh
Publication of CN105787368A publication Critical patent/CN105787368A/zh
Pending legal-status Critical Current

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/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • 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

Abstract

本发明公开了一种基于函数置乱的ROP防御方法与装置,包括以下步骤:1:待随机化保护的二进制可执行程序作为输入并对文件格式进行解析;2:将解析出的代码段二进制数据进行反汇编处理;3:提取敏感数据;4:通过解析符号表,准确地识别出所有的函数起始地址和结束地址;5:对代码段中的函数进行置乱处理,以及在置乱后的函数间进行空指令的随机填充,并对置乱后的二进制可执行程序进行偏移修正处理;6:输出函数随机化后的二进制可执行文件。本发明极大地加固了软件和系统对坑ROP攻击的强度,提升了软件运行时内存布局的随机性,提升了软件和系统的安全性。

Description

一种基于函数置乱的ROP防御方法与装置
技术领域
本发明属于信息安全技术领域,具体涉及一种基于函数置乱的对抗代码重用攻击的防御方法与装置,本发明通过函数置乱的随机化混淆技术,提高软件和系统的安全性。
背景技术
一直以来,内存错误是软件重要漏洞之一,并且一直在国家互联网应急响应中心CNCERT和CVE漏洞列表上占据前列。根据国家信息安全漏洞共享平台CNVD统计显示,2014年新增漏洞42409个。其中根据漏洞影响程序的对象类型分为:应用程序漏洞(61.01%),Web应用漏洞(22.74%)和操作系统漏洞(7.38%),网络设备漏洞(4.28%),数据库漏洞(2.86%),安全产品漏洞(1.74%);且远程漏洞比例高达71.34%,本地漏洞占24.83%。内存错误漏洞一般存在于应用程序、web应用和操作系统中。攻击者利用内存错误漏洞,对目标机器进行远程攻击,最终目的是在目标机器上执行恶意代码,实施危害。根据恶意代码的不同来源,攻击分为两类:一类是攻击者远程注入恶意代码,称为代码注入攻击;另一类是攻击者直接利用漏洞程序本身的代码片段,称为代码重用攻击(ROP,Return-OrientProgramming)。随着操作系统内存保护机制的增强,常见的代码注入方式不再有效,现阶段普遍流行的攻击手法即ROP攻击。攻击者一般能够利用内存错误漏洞获取漏洞程序的同等权限,甚至通过后期提权而窃取管理员权限,进而控制整个目标机器。
针对内存错误的检测和防御技术也层出不穷,其中随机化防御机制是一种基于概率性的保护技术,且卓有成效。根据随机化对象的不同,随机化防御技术一般分为接口随机化、数据随机化、指令随机化、地址随机化。四类随机化防御技术针对内存错误攻击,引入随机化的思想,对敏感信息和对象进行动态变换,使其不可预测。随机化对象的不同,导致动态变换的对象不同,因此防御的攻击模型存在一定差异。
当前已经广泛部署的地址空间布局随机化(ASLR),将程序、动态库的代码段、数据段以及堆栈区加载至内存的基址作为随机化对象,通过随机化变换,使得程序每次运行时,其自身代码段、数据段和调用的动态库的代码段、数据段以及堆栈区的内存基址均是一个变换的不可预测的随机地址。ASLR在一定程度上提高了ROP攻击的门槛,但是ASLR只是对加载基址进行了随机化,代码段中的相对地址仍然不变,随机化粒度较粗。攻击者一旦通过信息泄露某一指针内存地址便可根据相对偏移定位ROPGadget。
为了绕过ASLR的防御,当前流行的ROP攻击手法均利用信息泄露代码指针内存地址,然后根据相对偏移推测出目标程序运行时的整个内存布局,继而部署ROP攻击链。
发明内容
为了解决上述技术问题,本发明提出了一种基于函数置乱的ROP防御方法及装置,在ASLR的基础上,以二进制代码段中的函数作为随机化对象,利用函数置乱的方法实施更细粒度的函数级随机化。
本发明的方法所采用的技术方案是:一种基于函数置乱的ROP防御方法,其特征在于,包括以下步骤:
步骤1:待随机化保护的二进制可执行程序作为输入,对二进制可执行程序的文件格式进行解析;
步骤2:将解析出的代码段二进制数据进行反汇编处理;
步骤3:并在步骤1、步骤2的基础上,提取敏感数据;
步骤4:通过解析符号表,准确地识别出所有的函数起始地址和结束地址;
步骤5:对代码段中的函数进行置乱处理,以及在置乱后的函数间进行空指令的随机填充,并对置乱后的二进制可执行程序进行偏移修正处理;
步骤6:输出函数随机化后的二进制可执行文件。
作为优选,步骤1中所述的对二进制可执行程序的文件格式进行解析,主要包括文件头、程序头、节头、符号表、动态链接符号表。
作为优选,步骤3中所述的敏感数据为能够被攻击者利用来推测目标内存布局或者控制目标程序执行流的数据,通过分析目前流行的攻击手法并结合函数置乱需求,给出敏感数据的范畴,主要包括:跳转表(JumpTable)、虚表(VirtualTable)、全局函数指针(GlobalPointer)。
作为优选,所述跳转表跳转的指令类型符合特征:
movreg,qwordptr[reg*8+offset];
其中offset为跳转表基址,即只要出现该类型的指令,表明在进行跳转表的分支寻址操作,因此通过识别上述类型的指令即可识别出跳转表,然后提取跳转表中的所有分支地址。
作为优选,指向虚表首地址的虚表指针,初始化指令类型符合以下特征:
movmem,off_vtable;
其中off_vtable是一个立即数,且该立即数的值即为虚表首地址;因此通过识别上述类型的指令识别出虚表,然后提取出虚表中的所有虚函数地址。
作为优选,在“.preini_array”、“.init_array”、“.fini_array”这些节中存储了程序初始化和结束时的执行的一系列函数指针,因此,通过扫描上述节区,提取全局函数指针。
作为优选,步骤5中所述对代码段中的函数进行置乱处理,其实现过程是首先在函数识别的基础上,将代码段中的二进制数据以函数为单位进行分割;然后设置随机置乱因子Key,包括时间戳、软硬件编码、随机数,可由用户通过交互方式设置或者由程序自动随机生成;最后将分割的代码段函数和随机置乱因子Key作为函数置乱模块的输入,进行随机置乱,并根据置乱后的函数顺序组合成新的代码段,为了保证代码段的整体大小不变,利用空指令在置乱后的函数间或者代码段尾部进行随机填充。
作为优选,步骤5中所述对置乱后的二进制可执行程序进行偏移修正处理,包括程序入口点的修正,跳转表、虚表、全局函数指针的修正,符号表和动态链接符号表的中函数地址的修正,代码段指令偏移的修正;
所述程序入口点的修正,是将文件头部中描述程序入口点的字段修改为置乱后的程序入口点地址,即置乱后的“_start”函数入口地址;
所述跳转表、虚表、全局函数指针的修正,是将跳转表存储的分支跳转地址、虚表中存储的虚函数地址以及全局函数指针相应修改为置乱后的地址;
所述符号表和动态链接符号表的中函数地址的修正,是将符号表和动态连接符号表中函数符号的入口地址字段修改为置乱后的函数入口地址;
所述代码段指令偏移的修正,修正的指令主要包括5种:
(1)利用指令间的相对位移进行长跳转的指令,指令格式:jmp/calloffset;
(2)利用指令与数据段之间的相对位移进行间接地址跳转的指令,指令格式:jmp/callqwordptr[rip+disp];
(3)利用指令与数据段之间的相对位移存取数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp],reg、opcodeqword[rip+disp1],qword[rip+disp2];
(4)读取硬编码代码指针数据的指令,指令格式:opcodereg,imm、opcodeqword[rip+disp],imm,其中imm为硬编码代码指针;
(5)读取数据区代码指针数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp1],qword[rip+disp2],其中第二个操作数指向的数据区数据为代码指针;
代码段指令偏移的修正需要对上述类型指令的偏移“offset、disp、imm”以及引用数据区的代码指针按照置乱后的地址,重新计算偏移和代码指针地址并进行修正。
本发明的装置所采用的技术方案是:一种基于函数置乱的ROP防御装置,其特征在于:包括二进制文件解析模块、代码段反汇编模块、敏感数据提取模块、函数识别模块、函数置乱和偏移修正模块;
所述二进制文件解析模块,用于对待随机化保护的二进制可执行程序的文件格式进行解析;
所述代码段反汇编模块,用于将解析出的代码段二进制数据进行反汇编处理;
所述敏感数据提取模块,用于提取敏感数据;
所述函数识别模块,用于通过解析符号表,准确地识别出所有的函数起始地址和结束地址;
所述函数置乱和偏移修正模块,用于对代码段中的函数进行置乱处理,以及在置乱后的函数间进行空指令的随机填充,并对置乱后的二进制可执行程序进行偏移修正处理。
本发明技术的主要优点有:
1.函数置乱使指令与指令之间、指令与数据之间原有的固定偏移变得随机,极大地增加了攻击者通过偏移定位攻击代码片段的难度;
2.将地址随机化的粒度细化到函数级,并利用函数间的空指令随机填充方法,增加了相对地址的随机性,加固了地址随机化的防御强度;
3.对二进制程序实施离线函数置乱,运行时时间和内存开销为零;
4.对一个二进制程序的多次函数置乱,可生成多版本的二进制程序,增加二进制程序的多样性;
5.利用二进制重写技术实施函数置乱防御方案,不依赖源码支持。
本发明技术的主要创新点有:
1.将ASLR的绝对地址随机化防御策略扩展到函数级的相对地址随机化;
2.函数置乱过程中添加了函数间的空指令填充增加相对地址随机性;
3.函数置乱过程可由用户交互选取置乱因子。
附图说明
图1:本发明实施例的装置原理图;
图2:本发明实施例的函数置乱流程图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。
本发明技术方案的目的在于通过细粒度的函数置乱随机化方法加固现有的ASLR防御,增强软件和系统对抗ROP攻击的强度。
本发明提供的一种基于函数置乱的ROP防御方法,需构建如下装置:二进制文件解析模块,敏感数据提取模块,代码段反汇编模块,函数识别模块,函数置乱和偏移修正模块,如图1所示。
(1)二进制文件解析模块:首先,待随机化保护的二进制可执行程序作为输入,由二进制文件解析模块对二进制程序的文件格式进行解析,主要包括文件头、程序头、节头、符号表、动态链接符号表。
(2)在对二进制文件的全面解析的基础上,将解析出的代码段二进制数据作为代码段反汇编模块的输入进行反汇编处理。代码段反汇编模块使用了Capstone反汇编引擎,Capstone是一个轻量级的支持多平台(Windows,MacOSX,Ubuntu,Debian,FedoraCore,FreeBSD,OpenBSD,NetBSD&Python)多架构(Arm,Arm64(Armv8),M68K,Mips,PowerPC,Sparc,SystemZ,XCore&X86(includeX86_64))的反汇编引擎框架.
(3)敏感数据提取模块定义了敏感数据的范畴,并完成敏感数据的提取工作。站在攻击者的角度,敏感数据即为能够被攻击者利用来推测目标内存布局或者控制目标程序执行流的数据,通过分析目前流行的攻击手法并结合函数置乱需求,给出敏感数据的范畴,主要包括:跳转表(JumpTable)、虚表(VirtualTable)、全局函数指针(GlobalPointer)。
a)跳转表(JumpTable)的提取:跳转表是由编译器在编译分支处理语句“switchcase”时,当分支数大于等于4,且符合编译优化条件而产生的一张分支跳转表。该表一般存储在“.rodata”节中,该节内存权限为只读。从汇编层面分析,根据跳转表跳转的指令类型符合以下特征:
movreg,qwordptr[reg*8+offset];
其中offset为跳转表基址。即只要出现该类型的指令,表明在进行跳转表的分支寻址操作,因此可通过识别上述类型的指令即可识别出跳转表,然后提取跳转表中的所有分支地址。
b)虚表(VirtualTable)的提取:在C++面向对象编程中,使用关键字virtual声明的函数为虚函数,当类中定义有虚函数,编译时会生成一张虚函数地址表索引该类中的所有虚函数入口地址,这张表即为虚表,一般存储在“.rodata”节。另外,编译器还会再类中添加一个隐藏数据成员,指向虚表的首地址,称为虚表指针。通过分析,包含虚函数的类在初始化阶段,会在构造函数中完成对虚表指针的初始化。在汇编层面上,虚表指针的初始化指令类型符合以下特征:
movmem,off_vtable;
其中off_vtable是一个立即数,且该立即数的值即为虚表首地址。因此可通过识别上述类型的指令识别出虚表,然后提取出虚表中的所有虚函数地址。
c)全局函数指针(GlobalPointer)的提取:在“.preini_array”、“.init_array”、“.fini_array”这些节中存储了程序初始化和结束时的执行的一系列函数指针,因此,可通过扫描上述节区,提取全局函数指针。
(4)为了准确地识别出所有的代码段函数,函数识别模块需要依赖符号表的支持。符号表中记录了代码段中的所有函数符号、入口地址、函数大小。因此,可以通过解析符号表,准确地识别出所有的函数起始地址和结束地址。特别说明,“_start”、“call_gmon_start”、“deregister_tm_clones”、“register_tm_clones”、“_do_global_dtors_aux”、“frame_dymmy”五个特殊初始化函数在符号表中函数大小字段为0,因此需要根据这五个函数的结束指令特征,识别这五个函数的结束地址。
(5)函数置乱和偏移修正模块是本专利的核心模块。该模块完成对代码段中的函数进行置乱处理,以及对置乱后的二进制可执行程序进行偏移修正处理,如图2所示。
函数置乱:在函数识别的基础上,将代码段中的二进制数据以函数为单位进行分割,然后设置随机置乱因子(Key),包括时间戳、软硬件编码、随机数,可由用户通过交互方式设置或者由程序自动随机生成。最后将分割的代码段函数和随机置乱因子Key作为函数置乱模块的输入,进行随机置乱,并根据置乱后的函数顺序组合成新的代码段,为了保证代码段的整体大小不变,可利用空指令在置乱后的函数间或者代码段尾部进行随机填充。
偏移修正处理:函数置乱后,代码段中函数内部的相对位移发生改变,指令间的相对位移发生改变,指令与数据间的相对位移发生改变。因此,需要对置乱后的二进制程序进行偏移修正处理:
i.程序入口点的修正:将文件头部中描述程序入口点的字段修改为置乱后的程序入口点地址,即置乱后的“_start”函数入口地址。
ii.跳转表、虚表、全局函数指针的修正:将跳转表存储的分支跳转地址、虚表中存储的虚函数地址以及全局函数指针相应修改为置乱后的地址。
iii.符号表和动态链接符号表的中函数地址的修正:将符号表和动态连接符号表中函数符号的入口地址字段修改为置乱后的函数入口地址。
iv.代码段指令偏移的修正:通过汇编层面分析,需要修正的指令主要包括5种:
1)利用指令间的相对位移进行长跳转的指令,指令格式:jmp/calloffset;
2)利用指令与数据段之间的相对位移进行间接地址跳转的指令,指令格式:jmp/callqwordptr[rip+disp];
3)利用指令与数据段之间的相对位移存取数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp],reg、opcodeqword[rip+disp1],qword[rip+disp2];
4)读取硬编码代码指针数据的指令,指令格式:opcodereg,imm、opcodeqword[rip+disp],imm(其中imm为硬编码代码指针);
5)读取数据区代码指针数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp1],qword[rip+disp2],其中第二个操作数指向的数据区数据为代码指针。
代码段指令偏移的修正需要对上述类型指令的偏移“offset、disp、imm”以及引用数据区的代码指针按照置乱后的地址,重新计算偏移和代码指针地址并进行修正。
下面结合实施例对本发明做进一步阐述;
本发明技术支持多平台多架构,实验时以X8664位下编译的ELF二进制程序为实例实现函数置乱方案。为了清楚地描述具体实施过程,这里选取SPECCPU2006测试集中的“named”(ELFx86_64)程序为函数置乱的目标二进制程序展开说明。
首先,在linux下编译“named”源码,生成了带有符号表的“named”二进制ELF程序。然后将“named”二进制程序作为输入,通过二进制文件解析模块,进行ELF文件解析,提取“named”的ELF文件头信息、程序头表信息、节表信息以及符号表信息。二进制文件解析模块处理完成后,将提取的节表中属于可执行代码段的节所在ELF文件中的二进制数据提取出来,并作为代码段反汇编模块的输入,进行反汇编处理。反汇编模块将输出“named”代码段的汇编指令集,其中每一条指令是Capstone引擎封装的指令类实例。通过该实例,可以得到该指令所有指令特性(指令前缀、操作码、寻址模式、操作数、操作数类型、SIB(基址寄存器id、index寄存器id、scale)、displacement、立即数)。代码段反汇编模块处理完成后,将进行对“named”中敏感数据的提取,即通过遍历反汇编模块输出的汇编指令集,寻找具有跳转表、虚表以及全局函数指针相关的指令格式,并提取跳转表、虚表以及全局函数指针的相关信息。
上述处理操作完成后,将进入本发明技术的关键点:函数识别、函数置乱及偏移修正。为了提高函数识别的准确度,函数识别模块需要依赖符号表的支持。在二进制文件解析基础上,对“named”符号表进行解析,提取其中标识类型为函数的符号及其入口地址、函数大小,并计算函数结束地址。此外,实验中发现“_start”、“call_gmon_start”、“deregister_tm_clones”、“register_tm_clones”、“_do_global_dtors_aux”、“frame_dymmy”五个特殊初始化函数在符号表中函数大小字段为0,因此需要额外识别这些函数的结束地址。最终,识别出了“named”代码段中的所有函数,共103个。本发明以字符串“func”加上函数的入口地址来标识这些函数,比如,函数A入口地址为:0x401234,则该函数的标识为“func_0x401234”。函数识别完成后,本发明根据识别的函数,对“named”代码段进行分割,并将分割后的函数按照入口地址由小到大的顺序存储在一个数组中。该数组与设置的置乱因子作为输入,由函数置乱算子根据置乱因子对数组中的元素(即函数)进行置乱处理,然后在置乱后的函数间进行空指令的随机填充,保证代码段的整体大小不变,组合生成新的代码段。最后修正指令偏移,主要修正两个地方:a).代码段,包括指令与指令之间的引用偏移,指令与数据之间的引用偏移,以及指令中标识函数指针的立即数;b).数据段,包括跳转表、虚表、函数指针;c)符号表,包括静态符号表(.symtab)和动态链接符号表(.dynsym),更新其中标识函数符号的函数入口地址。偏移修正处理完成后,将修正后的文件头、程序头表、节表、置乱的代码段、数据段组装并生成一个新的二进制程序“named_rand”。新的二进制程序named_rand可直接替代原二进制程序“named”运行,两者具有相同的功能,相同的执行效率,唯一的差异在于二进制文件中代码段的函数顺序不一致,函数间空指令的随机填充字节数不一致,运行时的内存布局不一致。
本发明技术的保护点是程序运行时代码段的内存布局。利用函数置乱的方法将代码段内部的函数进行置乱处理,使得有序的函数排列变得无序,使得代码段内固定的相对偏移变得随机,从而使得程序运行时的内存布局更具随机性。部署本发明方案的软件或系统运行时的内存布局更加难以被攻击者推测,因此攻击者也更加难以定位可利用的攻击代码片段,从而无法成功地实施ROP攻击。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。

Claims (9)

1.一种基于函数置乱的ROP防御方法,其特征在于,包括以下步骤:
步骤1:待随机化保护的二进制可执行程序作为输入,对二进制可执行程序的文件格式进行解析;
步骤2:将解析出的代码段二进制数据进行反汇编处理;
步骤3:并在步骤1、步骤2的基础上,提取敏感数据;
步骤4:通过解析符号表,准确地识别出所有的函数起始地址和结束地址;
步骤5:对代码段中的函数进行置乱处理,以及在置乱后的函数间进行空指令的随机填充,并对置乱后的二进制可执行程序进行偏移修正处理;
步骤6:输出函数随机化后的二进制可执行文件。
2.根据权利要求1所述的基于函数置乱的ROP防御方法,其特征在于:步骤1中所述的对二进制可执行程序的文件格式进行解析,主要包括文件头、程序头、节头、符号表、动态链接符号表。
3.根据权利要求1所述的基于函数置乱的ROP防御方法,其特征在于:步骤3中所述的敏感数据为能够被攻击者利用来推测目标内存布局或者控制目标程序执行流的数据,通过分析目前流行的攻击手法并结合函数置乱需求,给出敏感数据的范畴,主要包括:跳转表、虚表、全局函数指针。
4.根据权利要求3所述的基于函数置乱的ROP防御方法,其特征在于:所述跳转表跳转的指令类型符合特征:
movreg,qwordptr[reg*8+offset];
其中offset为跳转表基址,即只要出现该类型的指令,表明在进行跳转表的分支寻址操作,因此通过识别上述类型的指令即可识别出跳转表,然后提取跳转表中的所有分支地址。
5.根据权利要求3所述的基于函数置乱的ROP防御方法,其特征在于:指向虚表首地址的虚表指针,初始化指令类型符合以下特征:
movmem,off_vtable;
其中off_vtable是一个立即数,且该立即数的值即为虚表首地址;因此通过识别上述类型的指令识别出虚表,然后提取出虚表中的所有虚函数地址。
6.根据权利要求3所述的基于函数置乱的ROP防御方法,其特征在于:在“.preini_array”、“.init_array”、“.fini_array”这些节中存储了程序初始化和结束时的执行的一系列函数指针,因此,通过扫描上述节区,提取全局函数指针。
7.根据权利要求1所述的基于函数置乱的ROP防御方法,其特征在于:步骤5中所述对代码段中的函数进行置乱处理,其实现过程是首先在函数识别的基础上,将代码段中的二进制数据以函数为单位进行分割;然后设置随机置乱因子Key,包括时间戳、软硬件编码、随机数;最后将分割的代码段函数和随机置乱因子Key作为函数置乱模块的输入,进行随机置乱,并根据置乱后的函数顺序组合成新的代码段,为了保证代码段的整体大小不变,利用空指令在置乱后的函数间或者代码段尾部进行随机填充。
8.根据权利要求1所述的基于函数置乱的ROP防御方法,其特征在于:步骤5中所述对置乱后的二进制可执行程序进行偏移修正处理,包括程序入口点的修正,跳转表、虚表、全局函数指针的修正,符号表和动态链接符号表的中函数地址的修正,代码段指令偏移的修正;
所述程序入口点的修正,是将文件头部中描述程序入口点的字段修改为置乱后的程序入口点地址,即置乱后的“_start”函数入口地址;
所述跳转表、虚表、全局函数指针的修正,是将跳转表存储的分支跳转地址、虚表中存储的虚函数地址以及全局函数指针相应修改为置乱后的地址;
所述符号表和动态链接符号表的中函数地址的修正,是将符号表和动态连接符号表中函数符号的入口地址字段修改为置乱后的函数入口地址;
所述代码段指令偏移的修正,修正的指令主要包括5种:
(1)利用指令间的相对位移进行长跳转的指令,指令格式:jmp/calloffset;
(2)利用指令与数据段之间的相对位移进行间接地址跳转的指令,指令格式:jmp/callqwordptr[rip+disp];
(3)利用指令与数据段之间的相对位移存取数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp],reg、opcodeqword[rip+disp1],qword[rip+disp2];
(4)读取硬编码代码指针数据的指令,指令格式:opcodereg,imm、opcodeqword[rip+disp],imm,其中imm为硬编码代码指针;
(5)读取数据区代码指针数据的指令,指令格式:opcodereg,qword[rip+disp]、opcodeqword[rip+disp1],qword[rip+disp2],其中第二个操作数指向的数据区数据为代码指针;
代码段指令偏移的修正需要对上述类型指令的偏移“offset、disp、imm”以及引用数据区的代码指针按照置乱后的地址,重新计算偏移和代码指针地址并进行修正。
9.一种基于函数置乱的ROP防御装置,其特征在于:包括二进制文件解析模块、代码段反汇编模块、敏感数据提取模块、函数识别模块、函数置乱和偏移修正模块;
所述二进制文件解析模块,用于对待随机化保护的二进制可执行程序的文件格式进行解析;
所述代码段反汇编模块,用于将解析出的代码段二进制数据进行反汇编处理;
所述敏感数据提取模块,用于提取敏感数据;
所述函数识别模块,用于通过解析符号表,准确地识别出所有的函数起始地址和结束地址;
所述函数置乱和偏移修正模块,用于对代码段中的函数进行置乱处理,以及在置乱后的函数间进行空指令的随机填充,并对置乱后的二进制可执行程序进行偏移修正处理。
CN201610109276.2A 2016-02-26 2016-02-26 一种基于函数置乱的rop防御方法与装置 Pending CN105787368A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610109276.2A CN105787368A (zh) 2016-02-26 2016-02-26 一种基于函数置乱的rop防御方法与装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610109276.2A CN105787368A (zh) 2016-02-26 2016-02-26 一种基于函数置乱的rop防御方法与装置

Publications (1)

Publication Number Publication Date
CN105787368A true CN105787368A (zh) 2016-07-20

Family

ID=56403862

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610109276.2A Pending CN105787368A (zh) 2016-02-26 2016-02-26 一种基于函数置乱的rop防御方法与装置

Country Status (1)

Country Link
CN (1) CN105787368A (zh)

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106372501A (zh) * 2016-08-22 2017-02-01 南京大学 一种针对rop攻击的防御方法
CN106682460A (zh) * 2016-11-25 2017-05-17 西北大学 一种基于两次变换的代码混淆方法
CN107220537A (zh) * 2017-05-25 2017-09-29 南京大学 一种程序内存布局信息泄露行为的检测方法
CN107688474A (zh) * 2016-08-04 2018-02-13 阿里巴巴集团控股有限公司 启动方法、生成内核镜像的方法及装置
CN109918950A (zh) * 2019-03-24 2019-06-21 哈尔滨理工大学 一种在嵌入式设备中识别二进制函数的应用方法
CN110516438A (zh) * 2018-05-21 2019-11-29 深信服科技股份有限公司 一种可执行文件反汇编的方法、系统及相关组件
CN111352842A (zh) * 2020-02-28 2020-06-30 成都金诺信高科技有限公司 基于嵌入式的软件调试方法
CN111752829A (zh) * 2020-06-22 2020-10-09 中国人民解放军海军工程大学 嵌入式系统固件程序的动态调试方法
WO2020253952A1 (en) * 2019-06-19 2020-12-24 Huawei Technologies Co., Ltd. Apparatus and method for kernel runtime randomization
CN113312087A (zh) * 2021-06-17 2021-08-27 东南大学 一种基于RISC处理器常量池布局分析与整合的Cache优化方法
CN113553041A (zh) * 2021-09-22 2021-10-26 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN114880665A (zh) * 2022-05-12 2022-08-09 电子科技大学 一种针对面向返回编程攻击的智能化检测方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104217157A (zh) * 2014-07-31 2014-12-17 珠海市君天电子科技有限公司 一种漏洞防利用方法及系统
US20150047049A1 (en) * 2013-08-12 2015-02-12 Cisco Technology, Inc. Binary Translation and Randomization System for Application Security
CN105095697A (zh) * 2014-05-06 2015-11-25 恩智浦有限公司 面向返回的编程作为混淆技术

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150047049A1 (en) * 2013-08-12 2015-02-12 Cisco Technology, Inc. Binary Translation and Randomization System for Application Security
CN105095697A (zh) * 2014-05-06 2015-11-25 恩智浦有限公司 面向返回的编程作为混淆技术
CN104217157A (zh) * 2014-07-31 2014-12-17 珠海市君天电子科技有限公司 一种漏洞防利用方法及系统

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
肖亮: "一种针对ROP攻击的函数粒度随机化防御方法的设计与研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *
钱逸: "基于 ARM 架构的ROP攻击与防御技术研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *
黄志军: "针对ROP攻击的程序安全性检测与防御技术的研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107688474A (zh) * 2016-08-04 2018-02-13 阿里巴巴集团控股有限公司 启动方法、生成内核镜像的方法及装置
CN107688474B (zh) * 2016-08-04 2021-05-07 斑马智行网络(香港)有限公司 启动方法、生成内核镜像的方法及装置
CN106372501B (zh) * 2016-08-22 2019-03-26 南京大学 一种针对rop攻击的防御方法
CN106372501A (zh) * 2016-08-22 2017-02-01 南京大学 一种针对rop攻击的防御方法
CN106682460B (zh) * 2016-11-25 2019-05-31 西北大学 一种基于两次变换的代码混淆方法
CN106682460A (zh) * 2016-11-25 2017-05-17 西北大学 一种基于两次变换的代码混淆方法
CN107220537B (zh) * 2017-05-25 2021-02-23 南京大学 一种程序内存布局信息泄露行为的检测方法
CN107220537A (zh) * 2017-05-25 2017-09-29 南京大学 一种程序内存布局信息泄露行为的检测方法
CN110516438A (zh) * 2018-05-21 2019-11-29 深信服科技股份有限公司 一种可执行文件反汇编的方法、系统及相关组件
CN110516438B (zh) * 2018-05-21 2023-11-07 深信服科技股份有限公司 一种可执行文件反汇编的方法、系统及相关组件
CN109918950A (zh) * 2019-03-24 2019-06-21 哈尔滨理工大学 一种在嵌入式设备中识别二进制函数的应用方法
WO2020253952A1 (en) * 2019-06-19 2020-12-24 Huawei Technologies Co., Ltd. Apparatus and method for kernel runtime randomization
CN111352842A (zh) * 2020-02-28 2020-06-30 成都金诺信高科技有限公司 基于嵌入式的软件调试方法
CN111752829A (zh) * 2020-06-22 2020-10-09 中国人民解放军海军工程大学 嵌入式系统固件程序的动态调试方法
CN113312087A (zh) * 2021-06-17 2021-08-27 东南大学 一种基于RISC处理器常量池布局分析与整合的Cache优化方法
CN113553041A (zh) * 2021-09-22 2021-10-26 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN113553041B (zh) * 2021-09-22 2021-12-10 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN114880665A (zh) * 2022-05-12 2022-08-09 电子科技大学 一种针对面向返回编程攻击的智能化检测方法及装置
CN114880665B (zh) * 2022-05-12 2023-06-16 电子科技大学 一种针对面向返回编程攻击的智能化检测方法及装置

Similar Documents

Publication Publication Date Title
CN105787368A (zh) 一种基于函数置乱的rop防御方法与装置
Wang et al. Ramblr: Making Reassembly Great Again.
Meng et al. Binary code is not easy
CN108345773B (zh) 基于虚拟机的代码保护方法及装置、电子设备、存储介质
Mohan et al. Opaque Control-Flow Integrity.
Niu et al. Monitor integrity protection with space efficiency and separate compilation
Gawlik et al. Towards automated integrity protection of C++ virtual function tables in binary programs
Hiser et al. ILR: Where'd my gadgets go?
Maisuradze et al. What Cannot Be Read, Cannot Be Leveraged? Revisiting Assumptions of {JIT-ROP} Defenses
Kruegel et al. Static disassembly of obfuscated binaries
US20090049425A1 (en) Code Obfuscation By Reference Linking
US20170024230A1 (en) Method, apparatus, and computer-readable medium for ofuscating execution of an application on a virtual machine
CN102662830A (zh) 一种基于动态二进制翻译框架的代码复用攻击检测系统
CN104134039B (zh) 病毒查杀方法、客户端、服务器以及病毒查杀系统
WO2015101042A1 (zh) 检测智能终端中恶意代码的方法及装置
US8281290B2 (en) Software diversity using context-free grammar transformations
WO2016135729A1 (en) A method to identify known compilers functions, libraries and objects inside files and data items containing an executable code
Payer et al. String oriented programming: When ASLR is not enough
Ayoade et al. Smart contract defense through bytecode rewriting
JP2022009556A (ja) ソフトウェアコードをセキュアにするための方法
Habibi et al. DisARM: mitigating buffer overflow attacks on embedded devices
Ferreira Torres et al. Elysium: Context-aware bytecode-level patching to automatically heal vulnerable smart contracts
CN115659333A (zh) 一种基于二进制插桩的沙箱、内存隔离方法及存储介质
Maisuradze et al. Dachshund: digging for and securing against (non-) blinded constants in jit code
Alam et al. Droidnative: Semantic-based detection of android native code malware

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20160720