基于模拟栈和线程注入的一种ROP攻击栈溢出防护方法与流程

文档序号:11177640阅读:1388来源:国知局
基于模拟栈和线程注入的一种ROP攻击栈溢出防护方法与流程

本发明涉及rop攻击防护技术领域,具体涉及基于模拟栈和线程注入的一种rop攻击栈溢出防护方法。



背景技术:

rop(return-orientedprogramming)是一种基于代码复用技术的新型攻击,攻击者供已有的库或可执行文件中提取指令片段、构建恶意代码。

seh(structuredexceptionhandling)seh("structuredexceptionha-ndling"),即结构化异常处理是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。

sehop(sehoverwriteprotection)sehop的全称是structuredexcept-ionhandleroverwriteprotection(结构化异常处理覆盖保护),seh攻击是指通过栈溢出或者其他漏洞,使用精心构造的数据覆盖结构化异常处理链表上面的某个节点或者多个节点,从而控制eip(控制程序执行流程)。而sehop则是是微软针对这种攻击提出的一种安全防护方案。

在操作系统和编译器的保护下,程序的栈是不可运行的、栈的位置是随机的,增大了栈溢出攻击的难度。但如果程序的加载位置是固定的或者程序中存在加载到固定位置的可执行代码,攻击者就可以利用这些固定位置上的代码来实施他的攻击,rop恶意代码不包含任何指令,将自己的恶意代码隐藏在正常代码中。因而,它可以绕过传统的栈溢出防御技术。



技术实现要素:

针对上述现有技术,本发明目的在于提供基于模拟栈和线程注入的一种rop攻击栈溢出防护方法,解决了现有技术由于程序加载位置固定导致不具有指令的rop恶意代码能够绕过栈溢出防护技术问题,以及解决了在利用模拟栈监控目标进程时所使用的远程线程注入造成目标进程中出现栈溢出的技术问题。

为达到上述目的,本发明采用的技术方案如下:

本方案主要利用线程注入到目标进程(所保护的进程),开辟一个模拟栈空间,监控模拟目标进程的指令流程,通过获取rop攻击的call和ret指令间的有效代码串连,在模拟栈上执行,再使用传统的溢出防护机制(如windows的缓冲区安全监测机制,gs)检测模拟栈上是否存在栈溢出,从而对rop攻击栈溢出漏洞的防护。

基于模拟栈和线程注入的一种rop攻击栈溢出防护方法,包括以下步骤:

步骤1、对目标进程注入远程线程,通过远程线程获得目标进程的指令流;

步骤2、通过目标进程函数的调用特征提取算法将指令流与受信的特征数据库进行比对,获得存在异常调用的指令序列;

步骤3、构建模拟栈并完成指令序列的拼接,然后在模拟栈中压入拼接的指令序列和金丝雀值,再利用函数进行模拟栈的指令调用,在函数进行返回前检测指令调用过程中金丝雀值,获得检测结果;

步骤4、根据检测结果通过远程线程回调控制目标进程的启停,并由检测结果选择地输出模拟栈上rop攻击代码和溢出点。

上述方法中,所述的步骤1,还包括以下步骤:

步骤1.1、获得目标进程的句柄,用远程进程根据句柄索引出目标进程;

步骤1.2、在远程进程中开辟出一段内存并根据目标进程动态链接库名称长度确定内存区间,在该内存中写入动态链接库的名称;

步骤1.3、使用库加载函数和远程线程创建函数根据动态链接库的名称创建出远程线程;

步骤1.4、关闭目标进程的句柄,再通过远程线程获得目标进程的指令流。

上述方法中,所述的步骤2,其中,对call指令和ret指令之间的指令流进行比对。

上述方法中,所述的步骤1.3,注入远程线程时,结合远程线程创建函数参数使用/stack开关指明已提交的堆栈大小值,重载向堆栈所提交地址空间的内存数量,实质并显著地避免了所使用的远程线程注入造成目标进程中出现栈溢出。

上述方法中,所述的步骤1.3,注入远程线程时,将递归类函数去除递归特征并将局部对象改为静态局部对象,实质并显著地避免了所使用的远程线程注入造成目标进程中出现栈溢出。

上述方法中,所述的步骤4,启停操作,已知目标进程名或进程id的情况下,linux下可以直接通过调用system函数运行kill进程id命令停止目标进程,windows下可使用powershell,原理类似;已知目标进程可执行文件位置的情况下,linux下可以直接通过system函数运行./file_position启动目标进程,windows下可使用powershell,原理类似。

与现有技术相比,本发明的有益效果:

利用线程注入到目标进程(要保护的进程),开辟一个模拟栈空间,监控模拟目标进程的指令流程,通过获取rop攻击的call和ret指令间的有效代码串连,在模拟栈上执行,再使用传统的溢出防护机制,从而达到检测rop攻击的目的,而本领域技术中,不同程序模块之间(特别是共享函数库的模块)数据的结构是相同的,在不破坏数据情况下不能对一个结构中的数据进行重新排布,缓冲后在一个结构中的任何数据是不可能使用金丝雀值检测的方法进行防护的,因此本发明通过模拟栈重新排布数据并加入金丝雀值,从而克服了现有技术由于数据结构限制而不能对结构中数据的栈溢出进行防护的技术壁垒;

本发明不影响原程序的最终构成,以外部线程注入监控目标程序的运行,不用改变现有的栈溢出防护机制;

本发明具有较好的准确性,模拟栈的设计可充分利用现有的多种栈溢出检测机制,从而提高准确性;

本发明具有较大的适用性,程序的防护和程序的运行具有较大的独立性,因而可适用于多种类型的软件程序。

附图说明

图1为本发明的模块示意图;

图2为寄存器指向堆栈示意图;

图3为函数调用源码示意图;

图4为堆栈结构示意图;

图5为监控窗口示意图;

图6为执行strcpy后的监控窗口示意图。

具体实施方式

本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。

下面结合附图对本发明做进一步说明:

栈溢出漏洞的原理

1)关于栈,程序的堆栈是由处理器直接支持,在interx86的系统中,堆栈在内存中是从高地址向低地址扩展,如图2:

与堆栈操作相关的两个寄存器是ebp和esp,esp总是指向堆栈栈顶,push时,esp-4,然后拷贝数据到esp指向的地址,pop时先把esp指向的数据拷贝到内存地址或寄存器,然后esp+4,栈中存储了函数的参数,函数的局部变量,调用函数前寄存器的值,函数的返回地址以及用于结构化异常处理的数据,ebp寄存器用于访问堆栈中的数据,函数的参数地址比ebp的值高,函数局部变量的地址比ebp的值低,因而可通过ebp与偏移地址来访问,下面是一组函数调用和它的堆栈结构图;

ebp寄存器的值总是指向先前的ebp,这样就形成了一个函数调用链,调试器正是利用这个跟踪函数堆栈调用顺序。

2)栈溢出攻击

实际情景中,攻击者可以使用待定的脚本语言,通过网络远程向对外提供业务的服务器进行攻击,利用对栈中数据的填充越界,也就是常说的shellcode,实现有效的漏洞攻击;

下面以一个例子简要说明栈溢出攻击:

a.漏洞源码:

b.源码说明:在verify_password中,直接将字符串password复制到buffer中,而没有检测password的长度是否超过buffer的大小,因而数据越界可覆盖返回地址,造成栈溢出攻击;

c.调试跟踪查看验证:strcpy执行前的返回地址为0x004109e8,strcpy执行后,返回地址被password变量超出的部分覆盖为0x77d456f7(jmpesp的地址),而jmpesp后正是注入的功能代码,此处作演示目的弹出一个messagebox。

3)现有的栈溢出防护机制

栈溢出典型的攻击行为主要有以下三种:

a.修改相邻数据

b.修改函数返回地址

c.修改seh(structuredexceptionhandling)

现有栈溢出防护机制:

a.栈不可执行机制:操作系统利用cpu硬件的特性,将栈段代码设置为不可执行;

b.windows的缓冲区安全监测机制(gs):gs会在函数调用前往函数栈帧内压入一个随机数(canary),然后等函数返回前,会对canary进行核查,判断canary是否被修改,因为canary的地址是(前栈帧ebp-4),所以如果溢出攻击想要覆盖返回地址或者异常处理句柄的话,就会路过canary,系统检测到canary被修改之后,在函数返回前就会直接终止程序;

c.内存布局随机化机制

内存布局随机化就是将程序的加载位置、堆栈位置以及动态链接库的映射位置随机化,这样攻击者就无法知道程序的运行代码和堆栈上变量的地址。

本发明利用线程注入到目标进程(要保护的进程),开辟一个模拟栈空间,监控模拟目标进程的指令流程,通过获取rop攻击的call和ret指令间的有效代码串连,在模拟栈上执行,再使用传统的溢出防护机制,从而达到检测rop攻击的目的。

实施例1

1.rop攻击防护系统利用远程线程注入到目标进程

使用dll远程注入技术:

1)openprocess获得要注入进程的句柄;

2)virtualallocex在远程进程中开辟出一段内存,长度为strlen(dllname)+1;

3)writeprocessmemory将dll的名字写入第二步开辟出的内存中;

4)createremotethread将loadlibrarya作为线程函数,参数为dll的名称,创建新线程;

5)closehandle关闭线程句柄。

2.监控目标进程的指令流程获取call和ret间的指令

注入的线程可模仿ollydbg附加监控目标进程,从而获取程序执行指令。

3.比对正常函数调用的特征指令,提取疑似异常的指令序列

设计特征提取算法,建立正常函数调用的特征数据库,比对获取的异常调用间的指令序列。

4.模拟栈尝试指令序列的多种拼接方案,试运行,尝试拼接,开启试运行线程,可能的汇编实现:

__asm{

leaeax,simulation_stack//模拟栈首地址

pusheax

ret//将simulation_stack的地址pop到eip,从而执行模拟栈的可疑指令序列

}。

5.传统检测机制检测模拟栈的运行情况

这里可借鉴windows的缓冲区安全监测机制(gs),往模拟栈压入一个canary,然后等函数返回前,会对canary进行核查,判断canary是否被修改,从而判断是否发生rop攻击。

6.根据检测结果回调控制目标进程的启停,并输出模拟栈上的rop攻击代码与溢出点。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何属于本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1