CN109766690A - 一种基于多策略指令检测的rop及变种攻击动态检测方法 - Google Patents
一种基于多策略指令检测的rop及变种攻击动态检测方法 Download PDFInfo
- Publication number
- CN109766690A CN109766690A CN201910057386.2A CN201910057386A CN109766690A CN 109766690 A CN109766690 A CN 109766690A CN 201910057386 A CN201910057386 A CN 201910057386A CN 109766690 A CN109766690 A CN 109766690A
- Authority
- CN
- China
- Prior art keywords
- instruction
- attack
- strategy
- ret
- rop
- 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
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于多策略指令检测的ROP及变种攻击动态检测方法,该方法基于二进制动态插桩技术拦截指令的方式,采用关键指令检测策略、攻击指令片段特征检测策略的两种策略判断方法来实现ROP攻击及变种攻击的检测。关键指令检测策略又根据指令地址及指令数量特征分析。攻击指令片断特征检测策略根据攻击功能及复杂度特征分析,包括攻击指令片段大小判断策略和攻击指令片段连续长度判断策略。本方法采用多层检测策略,从正常及异常指令特征两个角度、综合指令地址、数量、攻击功能、攻击复杂度等四类特征维度、结合确定性及不确定性两类检测方法综合实现ROP攻击及其变种攻击的检测。本方法性能消耗较低,占用内存空间小。
Description
技术领域
本发明涉及一种基于多策略指令检测的ROP及变种攻击动态检测方法,尤其涉及一种基于关键指令检测策略、攻击指令片段检测策略的多策略判断ROP攻击及变种攻击的检测方法,属于内存攻防领域。
背景技术
Solar Designer在1997年提出return-into-libc攻击技术通过漏洞利用将函数的返回地址替换为libc库中的函数代码块的地址,将控制流直接转向攻击者预先设计好的libc函数构成的攻击代码块。但一旦libc的开发者移除常用的system等库函数,攻击能力会受到很大的限制。Hovav Shacham在2007年提出了ROP攻击(Return-OrientedPrograming),通过扫描已有的动态链接库和可执行文件,根据一定的规则寻找内存中的以ret指令结尾的指令序列(指令片段gadget),组合实现各种复杂的攻击行为。针对ROP攻击的ret指令和gadget组合规律进行检测可以防止部分ROP攻击。然而,随后提出的ROP攻击变种可以不同程度绕过这些针对ret指令提出的防御机制。Checkoway等人在2010年提出用类似于ret属性的指令序列替代原有ret结尾指令序列。之后Blestch又提出JOP(jumpOriented Programing)攻击方式,不再以ret指令结尾而是以间接跳转指令jmp结尾。还有研究学者提出了BIOP攻击:使用jmp或call来控制程序执行流。将这些ROP的变种攻击统称为“X”OP攻击。
二进制代码动态翻译技术能够对程序二进制代码指令的动态执行过程进行实时监视、修改和记录,无需知道源代码,也不需要重新编译或重新链接程序,因此能够在不修改软件的前提下分析任何可执行软件的运行过程是否存在ROP及其变种攻击。但当前的基于二进制代码动态翻译技术的ROP及其变种攻击检测方式中面临以下几个问题。第一,检测方法不够全面,而单一检测方法的漏报率、误报率较高,对典型攻击的检测正确率较高,但难以发现特殊方式构造的攻击。例如,当前检测方法往往仅检测正常指令或异常指令特征,或部分特征(如指令地址、数量、攻击功能、攻击复杂度等特征中的一部分),或者仅使用确定性检测方法(如基于栈的检测方法仅检测跳转地址是否改变),或非确定性检测方法(如基于阈值的指令检测方法)。第二,较之基于指令的检测方法,基于栈的检测方法性能消耗过大。如基于影子栈的ROPdefender检测方法需要对栈进行两次操作,性能开销较高,占用内存更多。
发明内容
本发明要解决的技术问题是,提供一种基于多策略指令检测的ROP攻击及其变种攻击的动态检测方法,该方法具有低误报、低漏报和实时检测和无需程序源代码的优点。
为实现上述目的,本发明采用的技术方案为一种基于多策略指令检测的ROP及变种攻击动态检测方法,该方法基于二进制动态插桩技术拦截指令的方式,从正常及攻击角度综合分析,采用关键指令检测策略、攻击指令片段特征检测策略的两种策略判断方法来实现ROP攻击及变种攻击的检测。其中关键指令检测策略又根据指令地址及指令数量特征分析,包括了关键指令跳转策略和关键指令数量平衡策略。攻击指令片断特征检测策略根据攻击功能及复杂度特征分析,包括攻击指令片段大小判断策略和攻击指令片段连续长度判断策略。
其中,多策略判断逻辑如下:首先,采用关键指令地址跳转策略,能够检测出return-into-libc攻击和能够检测出以call指令结尾的gadget构造的攻击,且能够初步判断以jmp结尾的gadget是否是一个有效的gadget。第二,在关键指令地址跳转策略的基础上执行关键指令数量平衡判断策略,通过判断call_ret平衡条件,即当ret指令数目多于call指令数目时,能够检测出一部分典型ROP攻击。第三,由于上述策略不能检测出call指令数目多于ret指令数目时,可能发生的ROP攻击。因此在关键指令数量平衡判断策略的基础上执行攻击指令片段的大小(区分攻击功能)与连续长度(体现攻击整体复杂程度)特征判断策略,能够进一步判断是否是典型或者特殊构造的ROP攻击。第四,在关键指令跳转策略的基础上,执行指令片段特征检测策略,通过判断以jmp结尾的gadget的大小和连续gadget数目,能够进一步判断是否是特殊的JOP攻击。
策略1:关键指令检测策略
策略1.1关键指令跳转策略
(1)检测连续两次:ret跳转的目标地址是否是库函数的地址;
(2)检测call指令跳转的目标地址是否是函数的开始地址;
(3)检测jmp跳转地址与源地址间的距离d是否小于阈值T0;
策略1.2:关键指令数量平衡策略;
Δ=call_number–ret_number
策略2:攻击指令片段特征检测策略;
策略2.1攻击指令片段大小判断策略;
策略2.2攻击指令片段连续长度判断策略;
通过执行策略1中的策略1.1,,能够进行return-into-libc攻击、以call指令结尾的gadget构造的XOP变种攻击的检测。通过执行策略1.1中的(1)能够判断是否发生了return-into-libc攻击。执行策略1.1中的(2)判断能够判断是否发生了以call指令结尾的gadget构造的XOP变种攻击。执行策略1.1中的(3),当d>T0时能够判断以jmp结尾的指令序列是否可能是一个有效的gadget,从而判断典型的JOP攻击。
针对策略1.1中仅判断ret指令跳转的目标地址范围是否是库函数的开始地址从而导致:当ret目标地址跳转到非库函数地址时无法判断是否发生ROP攻击的问题,采用策略1.2:关键指令数量平衡策略进行ROP攻击的进一步检测。Δ<S1时,通过判断ret指令的数目多于call指令的数目来检测出典型的ROP攻击;Δ>S2时,程序正常,未发生ROP攻击。S1<=Δ<=S2,针对这种情况下,无法准确判断程序是发生了ROP攻击还是程序正常执行发生嵌套调用的问题,采用策略2:攻击指令片段特征检测策略进行ROP攻击的进一步检测。通过判断以ret指令结尾的gadget的大小和连续gadget的数目是否满足阈值条件来进一步检测ROP攻击。
针对策略1.1中jmp跳转的目标地址与jmp指令地址间的距离:d>T0时只能筛选出可能是有效的以jmp结尾的gadget,但无法确定是否发生JOP攻击的问题,为了更加准确的判断这些gadget是否是一个有效的gadget,从而判断典型的JOP攻击,此时采用策略2:攻击指令片段特征检测策略进行典型JOP攻击的进一步检测。通过判断以jmp指令结尾的gadget的大小和连续gadget的数目是否满足阈值条件来进一步检测出JOP攻击。
针对ROP攻击及其变种的各个特点,采用基于多策略指令检测的ROP及变种攻击的动态检测方法,能够提高检测ROP攻击及其变种攻击的正确率,降低误报率和漏报率。
本发明采用如下技术手段实现:
针对return-into-libc攻击ret指令控制流程跳转到库函数、jmp指令控制程序流在不同函数与不同库间跳转、以call结尾的gadget构造的变种攻击中call指令不代表函数开头的特点;针对ROP攻击及其变种攻击中call与ret指令数目不平衡的特点;针对ROP攻击及其变种攻击中,指令片段特征即以关键指令结尾的gadget大小与连续gadget数目的特点,结合二进制动态插桩工具Pin执行关键指令检测策略、攻击指令片段特征检测策略的多策略检测方法防御“X”OP攻击。
步骤:
步骤1:准备阶段:使用二进制动态插桩工具加载目标程序。
步骤2:拦截指令,判断指令类型。
步骤2.1如果是不含ROP攻击特征的指令(非call、ret、jmp指令),执行基于一般指令的分析模型;
步骤2.2如果是call、ret、jmp指令,则跳转到步骤3,执行关键指令检测策略。
步骤3:执行关键指令检测策略
步骤3.1执行关键指令跳转策略。
关键指令跳转策略包括ret指令跳转地址判断策略、call指令跳转地址判断策略、jmp指令跳转地址判断策略。
指令类型如果是ret指令,则执行ret指令跳转地址判断策略。其中ret指令跳转地址判断策略中,判断ret指令跳转的目标地址是否是libc中关键函数的地址。如果连续两次ret指令的目标地址是libc库中关键函数的地址,认为会发生return-into-libc攻击,跳转到步骤5,警告发生return-into-libc攻击,终止进程;否则跳转到步骤3.2,继续执行执行关键指令数量平衡策略继续判断是否发生ROP攻击。
指令类型如果是call指令,则执行call指令跳转地址判断策略。在call指令跳转地址判断策略中,判断call指令跳转的目标地址是否是函数的开始地址。搜集call指令跳转到的目标地址处的三条指令,并判断这三条指令的指令类型是否与push%rbp;mov%rsp,%rbp;sub$0x8,%rsp三条指令类型匹配,若匹配,认为call指令跳转的目标地址是函数的开始地址,认为未发生攻击,跳转到步骤3.2执行关键指令数量平衡判断策略;否则认为发生了以call结尾的gadget构造攻击,跳转到步骤5,警告发生以call结尾的gadget构造的攻击,终止进程。
如果是Jmp指令,则执行Jmp指令跳转地址判断策略。在Jmp指令的跳转地址判断策略中,判断jmp指令的源地址与jmp跳转的目标地址之间的距离。检测jmp指令的目标跳转地址与jmp指令地址的距离是否不小于阈值T0,如果jmp指令的目标跳转地址与jmp指令的距离小于T0,认为jmp在同一函数中跳转,未发生JOP攻击。若距离不小于T0,认为jmp不在同一函数和程序中跳转,可能发生JOP攻击,跳转到步骤4,继续执行攻击指令片段特征检测策略,进一步判断是否发生攻击了JOP攻击。
步骤3.2:执行关键指令数量平衡策略
设置call_ret变量判断call指令与ret指令是否平衡,在拦截到call指令时,变量加1,拦截到ret指令时变量减1。
正常程序中call指令和ret指令平衡,而在ROP攻击中,利用以ret结尾的指令序列来构造gadget链完成攻击,所以ROP攻击中,call与ret不平衡,call_ret是一个负值。因此在关键指令数量平衡策略中,判断call_ret的值是否小于阈值S1,如果call_ret<S1,阈值S1设置为0,认为会发生ROP攻击;若Call_ret的值不小于阈值S1且不大于阈值S2时,无法通过关键指令数量平衡策略来检测出可能发生的ROP攻击,所以继续执行步骤4的攻击指令片段特征检测策略,进一步判断是否发生了ROP攻击。
步骤4:执行攻击指令片段特征检测策略
步骤4.1执行攻击指令片段大小判断策略
判断gadget的大小是否小于阈值T1,如果Ins_count<T1,认为可能是一个有效的gadget。若指令类型是ret指令,则将以ret结尾的gadget的数目加1,跳转到执行步骤4.2,执行攻击指令片段连续长度判断策略,判断是否发生了ROP攻击。若指令类型是jmp指令,则将以jmp结尾的gadget的数目加1,跳转到执行步骤4.2,执行攻击指令片段连续长度判断策略,判断是否发生了JOP攻击。
步骤4.2执行攻击指令片段连续长度判断策略
如果是ret指令,判断连续以ret结尾的gadget的数目是否大于阈值T2,如果大于阈值T2,认为发生了ROP攻击,跳转到步骤5,警告发生了ROP攻击,终止进程;否则,认为未发生ROP攻击,跳转到步骤2,继续拦截下一条指令。如果是jmp指令,判断连续以jmp结尾的gadget的数目是否大于阈值T3,如果大于阈值T3,认为发生了JOP攻击,跳转到步骤5,警告发生了JOP攻击,终止进程;否则,认为未发生JOP攻击,跳转到步骤2,继续拦截下一条指令。
步骤5:执行程序结束模块,结束检测到的恶意程序的执行,提供检测分析结果。
本发明与现有技术相比,具有以下明显的优势和有益效果:
1)能够同时实现ROP及多种变种攻击的多角度、多特征维度、结合确定性与不确定性统计方式进行全面检测,传统单一检测方法相比,误报率及漏报率较低
现有方法主要针对单一攻击类型检测或基于单一检测方法进行ROP及多种变种攻击的检测。本方法采用多层检测策略,从正常及异常指令特征两个角度、综合指令地址、数量、攻击功能、攻击复杂度等四类特征维度、结合确定性及不确定性两类检测方法综合实现ROP攻击及其变种攻击的检测。不仅能够实现对return-into-libc攻击和ROP攻击、JOP攻击、以call结尾的gadget构造的攻击等不同攻击类型的检测,还能够检测出如长gadget构造的ROP攻击等特殊构造的ROP攻击。
2)采用基于指令分析进行攻击检测方法,较之基于栈的攻击检测方法,实现简单,性能消耗较低
基于栈的攻击检测方法通过分析比较影子栈预存的call指令的下一条指令的地址和ret指令的实际跳转地址检测ROP攻击,此过程需加倍栈操作时间和为影子栈增加内存,性能消耗较大。本方法直接对运行指令进行特征分析,无需对栈进行操作,性能消耗较低,占用内存空间小。
附图说明
图1为动态指令分析及多策略检测XOP攻击系统架构。
图2为多策略综合检测机制。
图3为基于其他指令的分析模型。
图4为基于ret指令的分析模型。
图5为基于call指令的分析模型。
图6为基于jmp指令的分析模型。
具体实施方式
下面结合附图和具体实施方式对本发明做进一步的说明:
本发明提出的关键指令检测(关键指令跳转策略和关键指令数量平衡策略)和攻击指令片段特征检测(攻击指令片断大小和连续长度判断策略)的多策略判断ROP攻击及变种攻击的检测方法的系统整体框架如附图1所示,主要包括指令分析模块、插桩模块、进程报警及终止模块。
插桩模块主要用于对加载的目标文件(源代码)进行指令级别的插桩,通过分析指令的类型决定要插桩的地点及内容。如在检测到ret指令后,在ret指令执行之前去插入ret分析代码。其中指令分析模块又包括call指令分析模块、ret指令分析模块、jmp指令分析模块、其他指令分析模块。指令分析模块主要用于在检测到关键指令(call、ret、jmp指令)后执行多层策略,如附图2所示,完成对ROP攻击及其变种攻击的检测操作。攻击响应模块主要用于完成发现攻击后打印相应的攻击警告并终止整个进程的操作。
本发明主要以二进制动态翻译工具PIN为例说明基于关键指令地址范围及数量平衡、指令片段特征的多层策略的ROP攻击及其变种攻击检测的执行过程,但不限于使用其他二进制动态翻译工具和插桩工具。
ROP攻击及其变种攻击检测的具体实施步骤为:
步骤1:准备阶段
步骤1.1,系统加载动态二进制检测框架pin,并进行初始化。
Pin采用了插装技术,支持IA-32,Intel(R)64和IA64架构上的Linux和Windows可执行程序。但Pin只是一个插桩的平台或框架,执行具体的插装任务要通过定义Pintool:”X”OP攻击检测模块来实现,在程序的执行过程中根据插桩代码动态插入分析代码。
步骤1.2,将编写的pintools进行编译,编译成.so或.dll的格式。
Pin会加载pintool(pintools工具中包含了插桩的指令,PIN是对应用程序进行插桩的引擎),然后pintool请求pin运行待插装的目标程序,对应用进程开始实时编译。
步骤1.3,使用PIN.EXE加载目标程序;
步骤2:拦截指令,判断指令类型,执行相应的分析函数;
步骤2.1使用Ins_IsRet(ins)、Ins_Iscall(ins)、Ins_IsBranch(ins)判断指令的类型。如果是ret指令,跳转到步骤2.2;如果是call指令,跳转到步骤2.3;如果是jmp指令,跳转到步骤2.4;如果是除call、ret、jmp指令之外的其他指令,跳转到步骤2.5。
步骤2.2通过在pintools中使用INS_InsertCall(ins,IPOINT_BEFORE,(AFUNPTR)retanalyze,IARG_END);命令使得在执行ret指令之前,执行retanalyze(ret分析函数),并跳转到步骤3.1.1,执行关键指令跳转策略中的ret指令跳转地址判断策略,如附图4所示;
步骤2.3通过在pintools中使用INS_InsertCall(ins,IPOINT_BEFORE,(AFUNPTR)callanalyze,IARG_END);命令使得在执行call指令之前,执行callanalyze(call分析函数),并跳转到步骤3.1.2,执行call指令跳转地址判断策略,如附图5所示;
步骤2.4通过在pintools中使用INS_InsertCall(ins,IPOINT_BEFORE,(AFUNPTR)jmpanalyze,IARG_END);命令使得在执行jmp指令之前,执行jmpanalyze(jmp分析函数),并跳转到步骤3.1.3,执行jmp指令跳转地址判断策略,如附图6所示;
步骤2.5执行基于一般指令的分析模型,如附图3所示:变量Ins_count=Ins_count+1;跳转到步骤2,继续拦截下一条指令。变量Ins_count代表非ROP攻击特征指令的条数(Ins_count初值设置为0)。
步骤3:执行关键指令检测策略,具体实施步骤为:
步骤3.1执行关键指令跳转策略
步骤3.1.1执行ret指令跳转地址判断策略;
步骤3.1.1.1ins_count=0;jmp_count=0;
步骤3.1.1.2判断当前ret指令的目标地址是否是libc中关键函数的地址;
如果ret指令的目标地址是关键函数的地址,且地址在库中,则设置变量rintol=True,跳转到步骤3.1.1.3;如果目标地址不是关键函数的地址,设置rintolpre的值为false,并跳转到步骤3.2,执行关键指令数量平衡策略,继续判断是否会发生ROP攻击。
步骤3.1.1.3执行ret指令跳转地址判断策略,判断上一条指令是否是libc中关键函数的地址;
判断rintolpre的值是否为True(判断前一条指令的地址是否是关键函数的地址)。如果rintolpre=True,则认为连续两次调用了库函数,发生了return_into_libc攻击。跳转到步骤5.1,打印发生return-into-libc攻击的警告,终止进程执行。如果rintolpre=False,认为第一次调用库函数有可能会发生”X”OP攻击,并将rintolpre的值设置为True,跳转到步骤3.2,执行关键指令数量平衡策判断略,继续判断是否会发生ROP攻击。
步骤3.1.2执行call指令跳转地址判断策略
判断call指令跳转的目标地址是否是函数的开始地址。
步骤3.1.2.1Ins_count=0;jmp_count=0;ret_count=0;rintolpre=False;
步骤3.1.2.2通过INS_DirectBranchOrCallTargetAddress(ins)获取call指令跳转的目标地址。
步骤3.1.2.3通过INS_Next(INS)搜集call指令跳转到目标地址处的三条指令。
步骤3.1.2.4判断call指令跳转的目标地址处的三条指令是否与push%rbp;mov%rsp,%rbp;sub$0x8,%rsp这三条指令类型匹配,若匹配,认为call指令跳转的目标地址是函数的开始地址,认为未发生攻击,跳转到步骤3.2.3,执行关键指令数量平衡判断策略;否则,警告发生了,以call结尾的gadget构造的变种攻击,并跳转到步骤5.3,打印发生了以call结尾的gadget构造的变种攻击的警告,终止进程执行。
判断call指令跳转的目标地址是否是函数的开始地址。一个函数被调用时,首先默认要完成以下动作:将调用函数的栈帧栈底地址入栈,即将bp寄存器的值压入调用栈中;然后建立新的栈帧,将被调函数的栈帧栈底地址放入bp寄存器中;最后%rsp栈指针寄存器移动(减)0x8字节,为变量分配空间。即完成下面三条指令:
Push %rbp;
mov %rsp,%rbp
sub $0x8,%rsp
针对call、ret平衡的BIOP攻击或是针对通过以call指令控制程序执行流的ROP攻击的变种,call指令跳转的地址不在函数的开始地址处。所以通过获取call指令跳转的目标地址,通过INS_Next(INS)搜集call指令跳转到目标地址后的指令与指令的下一条指令,并判断这三条指令的指令类型是否与上述三条指令类型匹配,可以判断是否发生了ROP攻击及其变种攻击。
步骤3.1.3执行jmp指令跳转地址判断策略
步骤3.1.3.1Ins_count=0;ret_count=0;rintolpre=False;
步骤3.1.3.2使用INS_DirectBranchOrCallTargetAddress(ins)函数获取jmp指令跳转的目标地址。
步骤3.1.3.3获取jmp跳转的目标地址与源地址之间的距离S:用目标地址减去当前jmp指令的地址的绝对值:INS_Address(INS)。
步骤3.1.3.4检测target_addr是否不小于阈值T0,若target_addr小于T0,认为jmp在同一函数中跳转,令jmp_count=0,跳转到步骤2继续拦截下一条指令。若距离不小于T0,认为jmp不在同一函数中跳转,可能是一个有效的以jmp结尾的gadget,可能会发生JOP,因此跳转到步骤4.1,继续执行攻击指令片断大小判断策略,进一步判断是否是一个有效的gadget,是否发生了JOP攻击。
JOP攻击中,jmp一般在函数间或不同库之间进行跳转;而在非正常程序中,jmp通常在函数内部跳转,jmp进行段内短转移是,修改IP的范围是-128到127。因此设置阈值T0的值为127。小于阈值T0的认为在函数内进行跳转,未发生攻击。大于阈值T0的,可能会发生攻击,继续执行其他的策略进行判断。
步骤3.2执行关键指令数量平衡判断策略,具体实施步骤为:
步骤3.2.1将变量call_ret=call_ret–1(拦截到ret指令);判断call_ret的值是否小于阈值S1,如果call_ret<S1,认为发生ROP攻击,跳转到步骤5.2,打印发生了ROP攻击的警告,并终止进程执行。
在正常程序中,call指令代表函数的开头,ret指令代表函数结尾,call指令与ret指令的数目是平衡的。在ROP攻击中使用以ret结尾的gadget构造gadget链来完成攻击,通过ret指令控制程序执行流,所以call与ret指令数目不平衡,ret指令的数目远多于call指令数目,因此当call_ret变量值小于0时,认为发生ROP攻击,阈值S1设置为0。通过检测变量call_ret的值是否是负值来判断是否发生ROP攻击。
步骤3.2.2判断call_ret的值是否不大于阈值S2,若call_ret不大于阈值S2,使用关键指令数目平衡判断策略无法判断这种情况下是否可能发生ROP攻击,因此跳转到步骤4,继续执行攻击指令片段特征检测策略,进一步判断是否发生了ROP攻击;否则跳转到步骤2拦截下一条指令继续执行。
因为发生连续的函数嵌套调用导致Call_ret的值暂时是非负值,所以可以通过执行攻击指令片段特征检测策略来进一步判断是否发生了ROP攻击,通常设置阈值S2为3。
步骤3.2.3将变量call_ret=call_ret+1(拦截到call指令),跳转到步骤2,继续拦截下一条指令。
步骤4:执行攻击指令片段特征检测策略,具体实施步骤为:
步骤4.1执行攻击指令片段大小判断策略
步骤4.1.1判断Ins_count的值是否小于阈值T1,如果Ins_count<T1,认为可能是一个有效的gadget,跳转到4.1.2继续执行。否则,认为这不是一个有效的gadget,跳转到步骤4.1.3继续执行。
步骤4.1.2如果拦截的jmp指令,令变量jmp_count+=1(jmp_count表示的是连续的以jmp结尾的有效的gadget的个数),跳转到步骤4.2.1继续执行攻击指令片段连续数量判断策略;如果拦截的是ret指令,令变量ret_count+=1,跳转到步骤4.2.2,继续执行攻击指令片段连续数量判断策略,进一步判断是否是一个有效的gadget。
通常在JOP攻击中,使用类似于pop%reg;jmp*(%reg)或dispatcher gadget(如add edx,4;jmp[edx])的指令序列来链接gadget,在ROP攻击中使用以ret结尾的指令序列来链接gadget。这些gadget的指令序列大小一般不超过7条。使用过长指令序列的gadget会造成一些不可避免的副作用,所以设置gadget指令序列的大小T1的值为7。当一个gadget的指令序列的大小小于7,认为这是一个合理的gadget,继续执行攻击指令片段连续数量判断策略继续进行判断是否发生攻击。若一个gadget的指令序列的大小大于阈值7时,认为不是一个有效的gadget,将变量Ins_count和jmp_count、ret_count置为0。
步骤4.1.3设置变量ret_count(拦截到ret指令)和jmp_count(拦截到jmp指令)的值为0,跳转到步骤2,继续拦截下一条指令。
步骤4.2,攻击指令片段连续数量判断策略
步骤4.2.1判断jmp_count的值是否大于阈值T2,如果jmp_count>T2,认为发生了JOP攻击,并跳转到步骤5.4,打印发现JOP攻击的警告,终止进程执行;否则跳转到步骤2,继续拦截下一条指令。
步骤4.2.2判断ret_count的值是否大于阈值T3,如果ret_count>T3,认为发生了ROP攻击,并跳转到步骤5.2,打印发现ROP攻击的警告,终止进程执行;否则跳转到步骤2,继续拦截下一条指令。
通常完成一个ROP攻击或ROP攻击变种,需要多个gadget链接完成,尤其是完成一个复杂攻击时,使用的gadget的数目更多。通过实验证明,gadget链的大小一般在15条左右,在正常程序中很难检测出连续的4条以ret、call、jmp结尾的gadget,因此,为了尽可能的减小误判和漏判,设置阈值T2为13。同时设置T3的阈值为2,判断在call_ret为非负值时可能出现的ROP攻击的情况
步骤5:攻击响应模块,打印报警信息,终止进程的执行。
步骤5.1警告:发现return-into-libc攻击,终止进程。
步骤5.2警告:发现ROP攻击,终止进程。
步骤5.3警告:发现以call结尾的gadget构造的XOP变种攻击,终止进程。
步骤5.4警告:发现典型的JOP攻击,终止进程。
Claims (5)
1.一种基于多策略指令检测的ROP及变种攻击动态检测方法,其特征在于:该方法基于二进制动态插桩技术拦截指令的方式,从正常及攻击角度综合分析,采用关键指令检测策略、攻击指令片段特征检测策略的两种策略判断方法来实现ROP攻击及变种攻击的检测;其中关键指令检测策略又根据指令地址及指令数量特征分析,包括了关键指令跳转策略和关键指令数量平衡策略;攻击指令片断特征检测策略根据攻击功能及复杂度特征分析,包括攻击指令片段大小判断策略和攻击指令片段连续长度判断策略;
其中,多策略判断逻辑如下:首先,采用关键指令地址跳转策略,能够检测出return-into-libc攻击和能够检测出以call指令结尾的gadget构造的攻击,且能够初步判断以jmp结尾的gadget是否是一个有效的gadget;第二,在关键指令地址跳转策略的基础上执行关键指令数量平衡判断策略,通过判断call_ret平衡条件,即当ret指令数目多于call指令数目时,能够检测出一部分典型ROP攻击;第三,由于上述策略不能检测出call指令数目多于ret指令数目时,可能发生的ROP攻击;因此在关键指令数量平衡判断策略的基础上执行攻击指令片段的大小(区分攻击功能)与连续长度(体现攻击整体复杂程度)特征判断策略,能够进一步判断是否是典型或者特殊构造的ROP攻击;第四,在关键指令跳转策略的基础上,执行指令片段特征检测策略,通过判断以jmp结尾的gadget的大小和连续gadget数目,能够进一步判断是否是特殊的JOP攻击;
策略1:关键指令检测策略
策略1.1关键指令跳转策略
(1)检测连续两次:ret跳转的目标地址是否是库函数的地址;
(2)检测call指令跳转的目标地址是否是函数的开始地址;
(3)检测jmp跳转地址与源地址间的距离d是否小于阈值T0;
策略1.2:关键指令数量平衡策略;
Δ=call_number–ret_number
策略2:攻击指令片段特征检测策略;
策略2.1攻击指令片段大小判断策略;
策略2.2攻击指令片段连续长度判断策略;
通过执行策略1中的策略1.1,能够进行return-into-libc攻击、以call指令结尾的gadget构造的XOP变种攻击的检测;通过执行策略1.1中的(1)能够判断是否发生了return-into-libc攻击;执行策略1.1中的(2)判断能够判断是否发生了以call指令结尾的gadget构造的XOP变种攻击;执行策略1.1中的(3),当d>T0时能够判断以jmp结尾的指令序列是否可能是一个有效的gadget,从而判断典型的JOP攻击。
2.根据权利要求1所述的一种基于多策略指令检测的ROP及变种攻击动态检测方法,其特征在于:针对策略1.1中仅判断ret指令跳转的目标地址范围是否是库函数的开始地址从而导致:当ret目标地址跳转到非库函数地址时无法判断是否发生ROP攻击的问题,采用策略1.2:关键指令数量平衡策略进行ROP攻击的进一步检测;Δ<S1时,通过判断ret指令的数目多于call指令的数目来检测出典型的ROP攻击;Δ>S2时,程序正常,未发生ROP攻击;S1<=Δ<=S2,针对这种情况下,无法准确判断程序是发生了ROP攻击还是程序正常执行发生嵌套调用的问题,采用策略2:攻击指令片段特征检测策略进行ROP攻击的进一步检测;通过判断以ret指令结尾的gadget的大小和连续gadget的数目是否满足阈值条件来进一步检测ROP攻击。
3.根据权利要求1所述的一种基于多策略指令检测的ROP及变种攻击动态检测方法,其特征在于:针对策略1.1中jmp跳转的目标地址与jmp指令地址间的距离:d>T0时只能筛选出可能是有效的以jmp结尾的gadget,但无法确定是否发生JOP攻击的问题,为了更加准确的判断这些gadget是否是一个有效的gadget,从而判断典型的JOP攻击,此时采用策略2:攻击指令片段特征检测策略进行典型JOP攻击的进一步检测;通过判断以jmp指令结尾的gadget的大小和连续gadget的数目是否满足阈值条件来进一步检测出JOP攻击。
4.根据权利要求1所述的一种基于多策略指令检测的ROP及变种攻击动态检测方法,其特征在于:针对ROP攻击及其变种的各个特点,采用基于多策略指令检测的ROP及变种攻击的动态检测方法,能够提高检测ROP攻击及其变种攻击的正确率,降低误报率和漏报率。
5.根据权利要求1所述的一种基于多策略指令检测的ROP及变种攻击动态检测方法,其特征在于:针对return-into-libc攻击ret指令控制流程跳转到库函数、jmp指令控制程序流在不同函数与不同库间跳转、以call结尾的gadget构造的变种攻击中call指令不代表函数开头的特点;针对ROP攻击及其变种攻击中call与ret指令数目不平衡的特点;针对ROP攻击及其变种攻击中,指令片段特征即以关键指令结尾的gadget大小与连续gadget数目的特点,结合二进制动态插桩工具Pin执行关键指令检测策略、攻击指令片段特征检测策略的多策略检测方法防御“X”OP攻击;
步骤:
步骤1:准备阶段:使用二进制动态插桩工具加载目标程序;
步骤2:拦截指令,判断指令类型;
步骤2.1如果是不含ROP攻击特征的指令,执行基于指令的分析模型;
步骤2.2如果是call、ret、jmp指令,则跳转到步骤3,执行关键指令检测策略;
步骤3:执行关键指令检测策略
步骤3.1执行关键指令跳转策略;
关键指令跳转策略包括ret指令跳转地址判断策略、call指令跳转地址判断策略、jmp指令跳转地址判断策略;
指令类型如果是ret指令,则执行ret指令跳转地址判断策略;其中ret指令跳转地址判断策略中,判断ret指令跳转的目标地址是否是libc中关键函数的地址;如果连续两次ret指令的目标地址是libc库中关键函数的地址,认为会发生return-into-libc攻击,跳转到步骤5,警告发生return-into-libc攻击,终止进程;否则跳转到步骤3.2,继续执行执行关键指令数量平衡策略继续判断是否发生ROP攻击;
指令类型如果是call指令,则执行call指令跳转地址判断策略;在call指令跳转地址判断策略中,判断call指令跳转的目标地址是否是函数的开始地址;搜集call指令跳转到的目标地址处的三条指令,并判断这三条指令的指令类型是否与push%rbp;mov%rsp,%rbp;sub$0x8,%rsp三条指令类型匹配,若匹配,认为call指令跳转的目标地址是函数的开始地址,认为未发生攻击,跳转到步骤3.2执行关键指令数量平衡判断策略;否则认为发生了以call结尾的gadget构造攻击,跳转到步骤5,警告发生以call结尾的gadget构造的攻击,终止进程;
如果是Jmp指令,则执行Jmp指令跳转地址判断策略;在Jmp指令的跳转地址判断策略中,判断jmp指令的源地址与jmp跳转的目标地址之间的距离;检测jmp指令的目标跳转地址与jmp指令地址的距离是否不小于阈值T0,如果jmp指令的目标跳转地址与jmp指令的距离小于T0,认为jmp在同一函数中跳转,未发生JOP攻击;若距离不小于T0,认为jmp不在同一函数和程序中跳转,可能发生JOP攻击,跳转到步骤4,继续执行攻击指令片段特征检测策略,进一步判断是否发生攻击了JOP攻击;
步骤3.2:执行关键指令数量平衡策略
设置call_ret变量判断call指令与ret指令是否平衡,在拦截到call指令时,变量加1,拦截到ret指令时变量减1;
正常程序中call指令和ret指令平衡,而在ROP攻击中,利用以ret结尾的指令序列来构造gadget链完成攻击,所以ROP攻击中,call与ret不平衡,call_ret是一个负值;因此在关键指令数量平衡策略中,判断call_ret的值是否小于阈值S1,如果call_ret<S1,阈值S1设置为0,认为会发生ROP攻击;若Call_ret的值不小于阈值S1且不大于阈值S2时,无法通过关键指令数量平衡策略来检测出可能发生的ROP攻击,所以继续执行步骤4的攻击指令片段特征检测策略,进一步判断是否发生了ROP攻击;
步骤4:执行攻击指令片段特征检测策略
步骤4.1执行攻击指令片段大小判断策略
判断gadget的大小是否小于阈值T1,如果Ins_count<T1,认为可能是一个有效的gadget;若指令类型是ret指令,则将以ret结尾的gadget的数目加1,跳转到执行步骤4.2,执行攻击指令片段连续长度判断策略,判断是否发生了ROP攻击;若指令类型是jmp指令,则将以jmp结尾的gadget的数目加1,跳转到执行步骤4.2,执行攻击指令片段连续长度判断策略,判断是否发生了JOP攻击;
步骤4.2执行攻击指令片段连续长度判断策略
如果是ret指令,判断连续以ret结尾的gadget的数目是否大于阈值T2,如果大于阈值T2,认为发生了ROP攻击,跳转到步骤5,警告发生了ROP攻击,终止进程;否则,认为未发生ROP攻击,跳转到步骤2,继续拦截下一条指令;如果是jmp指令,判断连续以jmp结尾的gadget的数目是否大于阈值T3,如果大于阈值T3,认为发生了JOP攻击,跳转到步骤5,警告发生了JOP攻击,终止进程;否则,认为未发生JOP攻击,跳转到步骤2,继续拦截下一条指令;
步骤5:执行程序结束模块,结束检测到的恶意程序的执行,提供检测分析结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910057386.2A CN109766690B (zh) | 2019-01-19 | 2019-01-19 | 一种基于多策略指令检测的rop及变种攻击动态检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910057386.2A CN109766690B (zh) | 2019-01-19 | 2019-01-19 | 一种基于多策略指令检测的rop及变种攻击动态检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109766690A true CN109766690A (zh) | 2019-05-17 |
CN109766690B CN109766690B (zh) | 2021-01-08 |
Family
ID=66454921
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910057386.2A Active CN109766690B (zh) | 2019-01-19 | 2019-01-19 | 一种基于多策略指令检测的rop及变种攻击动态检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109766690B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112395603A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 基于指令执行序列特征的漏洞攻击识别方法、装置及计算机设备 |
CN113312088A (zh) * | 2021-06-29 | 2021-08-27 | 北京熵核科技有限公司 | 一种程序指令的执行方法及装置 |
CN114880665A (zh) * | 2022-05-12 | 2022-08-09 | 电子科技大学 | 一种针对面向返回编程攻击的智能化检测方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105138903A (zh) * | 2015-08-14 | 2015-12-09 | 电子科技大学 | 一种基于ret指令与jmp指令的rop攻击检测方法 |
CN107330323A (zh) * | 2017-07-10 | 2017-11-07 | 电子科技大学 | 一种基于Pin工具的ROP及其变种攻击的动态检测方法 |
US10049211B1 (en) * | 2014-07-16 | 2018-08-14 | Bitdefender IPR Management Ltd. | Hardware-accelerated prevention of code reuse attacks |
-
2019
- 2019-01-19 CN CN201910057386.2A patent/CN109766690B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10049211B1 (en) * | 2014-07-16 | 2018-08-14 | Bitdefender IPR Management Ltd. | Hardware-accelerated prevention of code reuse attacks |
CN105138903A (zh) * | 2015-08-14 | 2015-12-09 | 电子科技大学 | 一种基于ret指令与jmp指令的rop攻击检测方法 |
CN107330323A (zh) * | 2017-07-10 | 2017-11-07 | 电子科技大学 | 一种基于Pin工具的ROP及其变种攻击的动态检测方法 |
Non-Patent Citations (3)
Title |
---|
刘智: "二进制代码级的漏洞攻击检测研究", 《万方学位论文》 * |
向琦: "基于插桩技术的漏洞自动化验证研究与实现", 《中国优秀硕士学位论文全文数据库(信息科技辑)》 * |
黄志军: "一种基于DBI的ROP攻击检测", 《计算机科学》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112395603A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 基于指令执行序列特征的漏洞攻击识别方法、装置及计算机设备 |
CN112395603B (zh) * | 2019-08-15 | 2023-09-05 | 奇安信安全技术(珠海)有限公司 | 基于指令执行序列特征的漏洞攻击识别方法、装置及计算机设备 |
CN113312088A (zh) * | 2021-06-29 | 2021-08-27 | 北京熵核科技有限公司 | 一种程序指令的执行方法及装置 |
CN114880665A (zh) * | 2022-05-12 | 2022-08-09 | 电子科技大学 | 一种针对面向返回编程攻击的智能化检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109766690B (zh) | 2021-01-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100942795B1 (ko) | 악성프로그램 탐지장치 및 그 방법 | |
US8117660B2 (en) | Secure control flows by monitoring control transfers | |
CN109766690A (zh) | 一种基于多策略指令检测的rop及变种攻击动态检测方法 | |
CN109558726B (zh) | 一种基于动态分析的控制流劫持攻击检测方法与系统 | |
US10650147B2 (en) | Method and apparatus for ensuring control flow integrity | |
CN105138903A (zh) | 一种基于ret指令与jmp指令的rop攻击检测方法 | |
CN105260659A (zh) | 一种基于qemu的内核级代码重用型攻击检测方法 | |
CN102708013A (zh) | 程序语句控制的指令流控制 | |
CN113497809A (zh) | 基于控制流和数据流分析的mips架构漏洞挖掘方法 | |
CN114780962B (zh) | 基于动态能量调控的Windows程序模糊测试方法及系统 | |
Lanzi et al. | A smart fuzzer for x86 executables | |
CN108830078A (zh) | 一种针对工控设备的恶意代码发现方法 | |
Chen et al. | Efficient detection of the return-oriented programming malicious code | |
Liu et al. | Vulnerability analysis for x86 executables using genetic algorithm and fuzzing | |
CN110162472A (zh) | 一种基于fuzzing测试的测试用例生成方法 | |
CN106339628A (zh) | 基于微体系结构级别的硬件反病毒装置 | |
US11263307B2 (en) | Systems and methods for detecting and mitigating code injection attacks | |
CN114880665B (zh) | 一种针对面向返回编程攻击的智能化检测方法及装置 | |
US20220138311A1 (en) | Systems and methods for detecting and mitigating code injection attacks | |
CN114329478A (zh) | 一种安卓系统服务内存消耗类漏洞挖掘方法 | |
CN114647845A (zh) | 一种恶意样本延时代码的检测识别方法及装置 | |
KR101421630B1 (ko) | 코드 인젝션된 악성코드 탐지 시스템 및 방법 | |
Yuan et al. | A method for detecting buffer overflow vulnerabilities | |
Jiang et al. | An exploitability analysis technique for binary vulnerability based on automatic exception suppression | |
Puhan et al. | Program crash analysis based on taint analysis |
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 |