一、windows操作系统中提供的主要几种软件漏洞利用的防范技术
1 ASLR
地址空间分布随机化(addressspace layout randomization)是一项通过将系统关键地址随机化,从而使攻击者无法获得需要跳转的精确地址的技术。
使用ASLR技术的目的
使用ASLR技术的目的就是打乱系统中存在的固定地址,使攻击者很难从进程的内存空间中找到稳定的跳转地址。
执行时间
当程序启动将执行文件加载到内存时,操作系统通过内核模块提供的ASLR功能,在原来映像基址的基础上加上一个随机数作为新的映像基址。
2 GS stack protection
GS stack protection 技术是一项栈缓冲区溢出的检测防护技术。编译器会针对函数调用和返回时添加保护和检测功能的代码,在函数被调用时,在缓冲区和函数返回地址增加一个32位的随机数security_cookie(用来检测是否发生的溢出),在函数返回时,调用检查函数检查security_cookie的值是否有变换,如果发生了变换说明产生了溢出,终止程序。
GS stack protect 针对栈溢出起到了很好地防范作用
3 DEP
数据执行保护(data execute prevention)技术可以限制内存堆栈区的代码为不可执行状态,从而防范溢出后代码的执行。
现在的攻击主要考虑如何绕过DEP
DEP分为软件DEP和硬件DEP,硬件DEP需要cpu的支持,需要CPU在页表增加一个保护位NX(no excute)来控制页面是否可执行。现在的DEP保护机制一般都采用硬件DEP。
SafeSEH
用于异常处理的防护措施
SEH (structured exception handler)是windows异常处理机制所采用的重要数据结构链表
发生异常时,系统调用异常处理函数,但是这个异常处理函数被恶意程序覆写了。
当PE文件被加载时,系统读出SEH函数表的地址,使用随机数加密后,存储在一个地方,当PE文件执行时,解密SEH,从而获得SEH函数表的地址,然后针对程序中每个异常处理函数检查是否在合法的SEH函数表中,如果没有则说明非法。同时也要检测异常处理函数是否在栈上,如果在栈上也将停止异常处理。(不能在堆栈中存放可执行代码)
SEHOP
SEH是window异常处理机制所采用的的重要数据链表,是一个SEH函数表(里面有各种异常处理函数)。
SEH攻击是通过栈溢出或者其他漏洞,使精心构造的数据覆盖SEH上面的某个函数或者多个函数,从而控制EIP(控制程序执行流程)
SEHOP的核心是检测程序栈中所有SEH结构链表的完整性
漏洞利用技术——地址利用技术
1 静态shellcode地址的利用技术 (可以准确定位局部变量位置)
如果存在溢出漏洞的程序,是一个操作系统每次启动都要加载的程序,操作系统启动时为其分配的内存地址一般是固定的,则函数调用时分配的栈帧地址也是固定的。
溢出后写入栈帧的shellcode代码其内存地址也是静态不变的,所以可以直接将shellcode代码在栈帧中的静态地址覆盖原有返回地址。
总的来说就是shellcode代码写入的地址是静态不变的,可以准确定位到该位置。
2 动态变化的shellcode地址的利用技术 (可以利用esp准确定位返回地址下面的地址)
某些软件的漏洞存在于某些动态链接库中,这些动态链接库在进程运行时被动态加载,因而在下一次这些动态链接库被重新装载到内存中,其在内存中的栈帧地址是动态变化的,则植入的shellcode代码在内存中的起始地址也是变化的。
通过ESP寄存器的特性来实现。ESP寄存器中的栈顶指针总是指向返回地址在内存高地址方向的相邻位置,从而可以实现准确定位到返回地址,在与返回地址相邻的高地址位置写入shellcode代码,这样就能通过ESP寄存器来实现定位shellcode代码地址
具体实现步骤:
- 第一步,找到内存中任意一条汇编指令jmp esp的地址
- 第二步,设计好输入数据,使缓冲区溢出后,前面的内容为任意数据,覆盖返回地址的是jump esp指令的地址,紧接着覆盖返回地址下面的地址并写入shellcode代码。(之前是在上面写shellcode代码,但现在上面的局部变量难以定位)
-
第三位,函数调用完成后函数返回,根据返回地址中的地址去执行jump esp指令,而此时esp指向的是返回地址相邻的高地址位置,在这个位置中保存着shellcode代码
总的来说就是当局部变量的局部地址难以定位时,可以利用函数执行完后esp指向返回地址下面的地址的特性来作为跳板实现shellcode的准确定位。
3 堆喷洒技术heap spray
当准确定位shellcode的地址难以实现时,可以采用堆喷洒技术。
heap spary堆喷洒技术,是在shellcode前面加上大量的滑板指令slide code,组成一个非常长的注入代码段。然后向系统申请大量内存,并且反复用这个注入代码段来填充。这样就使得内存空间被大量的注入代码段所占据
这样当程序跳转到堆中被填充了注入代码段的任一地址,程序指令就会顺序滑板指令最终执行到shellcode代码
通过反反复复填充,当程序落到滑板指令上时,就会执行shellcode
滑板指令(slide code)是由大量的NOP(no-operation)空指令组成的指令序列,cpu遇到滑板指令会一直执行下去,中间不作任何操作。
网页木马通常使用堆喷洒技术来实现
漏洞利用技术——绕过DEP
返回导向编程ROP
利用现成的可执行的代码区域的指令片段来组成恶意代码。
找一些已经存在的并且以retn结尾的代码块,把这些代码块布置在堆栈上,当控制EIP并返回时,程序就会跳转去执行这些代码块
换言之,ROP允许攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。
- ROP是通过ROP链(retn)来实现有序汇编指令的执行
- ROP链是由一个个ROP小配件组成
-
ROP小配件是由 “目的执行指令+retn指令组成”
retn指令相当于 pop EIP EIP指向新的配件的地址