Windows内存保护机制及绕过方法

0 目录

  • GS编译

  • SafeSEH机制

  • SEH覆盖保护

  • 数据执行保护(DEP)

  • 地址随机化(ASLR)

1 GS编译

1.1 基本原理

       Windows操作系统为解决栈溢出漏洞的问题引入了一个对策——GS编译保护技术。

       GS编译保护技术是通过编译时添加相关代码而实现的,开启GS 编译选项后会在函数的开头和结尾添加代码来阻止栈溢出漏洞的利用。当应用程序启动时,程序的cookie被计算出来(伪随机数)并保存在.data 节段中,在函数的开头这个 cookie 被拷贝到栈中,位于返回地址和局部变量的中间。

       函数调用完后系统检测cookie值是否被修改。

1.2 绕过方法

  • 计算/猜测cookie值
  • 覆盖虚函数表

       堆栈布局:[局部变量][cookie][入栈寄存器][返回地址][参数][虚表指针]。

       覆盖对象和虚函表指针,如果你把这个指针指向一个用于欺骗的虚函数表,你就可以重定向这个虚函数的调用,并执行恶意的代码。

  • 覆盖SHE

       SEH句柄用于指向异常处理函数,这个句柄被存在SecurityCookie的上方,这使得攻击者不需要覆盖到SecurityCookie就可以修改SEH句柄指向的位置。

  • 同时替换掉栈中和.data段中的cookie值

       通过替换加载模块.data 节中的cookie 值(可写)来绕过栈上的 cookie 保护,并用相同的值替换栈中的cookie。

2 SafeSEH机制

2.1 基本原理

       通过覆盖SEH可以绕过GS编译保护,所以微软又引入了一种SEH的安全校验机制——SafeSEH。

       通过启用/SafeSEH编译选项来把这种机制应用到所有的执行模块上,当异常处理器被执行前,SafeSEH会验证异常处理链是否被修改过。系统会从头到尾遍历异常处理链表,并逐个验证它们的有效性。

       如果覆盖SEH,这将破坏链表并触发SafeSEH机制。

2.2 绕过方法

  • 利用未开启SafeSEH保护的模块

       寻找程序中加载的未开启SafeSEH保护的模块来绕过,比如软件本身自带的dll文件。

  • 利用堆绕过

       SafeSEH允许其异常处理句柄位于除栈空间之外的非映像页面。如果你将shellcode写在堆空间中 ,再覆盖SEH链表的地址。使程序异常处理句柄指向堆空间,就可以绕过SafeSEH的检测了。

  • 覆盖虚函数表(同上)

3 SEH覆盖保护

3.1 基本原理

       SEH覆盖保护(SEHOP)可作为SEH的扩展,用于检测SEH是否被覆写。

       SEHOP的核心特性是用于检测程序栈中的所有SEH结构链表的完整性,特别是对最后一个SHE结构的检测。在最后一个SEH结构中拥有一个特殊的异常处理函数指针,指向一个位于ntdll中的函数ntdll!FinalExceptHandler()。

3.2 绕过方法

  • 利用未开启SEHOP保护的模块
  • 覆盖虚函数表
  • 伪造SEH链表

4 数据执行保护(DEP)

4.1 基本原理

       数据执行保护 (DEP) 是一套软硬件技术,能够在内存上执行额外检查以防止在不可运行的内存区域上执行代码。

       DEP 有两种模式,如果 CPU 支持内存页 NX 属性, 就是硬件支持的 DEP。如果 CPU 不支持, 那就是软件支持的 DEP 模式,这种 DEP 不能阻止在数据页上执行代码,但可以防止其他的 exploit(如SEH覆盖)。

4.2 绕过方法

  • ret2libc

       ret2libc是一种通过retn指令在库函数中寻找可用代码的攻击方式。由于其所有代码都是从libc中找到的,所以不存在不可执行的问题。

  • 关闭进程的DEP (NtSetInformationProcess)

       因为 DEP 可以设置不同的模式,操作系统需要能动态关闭DEP,因此系统肯定有API来启用或关闭NX,如果黑客可以找到这个NTDLL中的 API,就能绕过硬件DEP保护。一个进程的DEP设置标志保存在内核结构中(KPROCESS结构),这个标志可以用函数NtQueryInformationProcess和NtSetInformationProcess通过设置ProcessExecuteFlags类来查询和修改,用内核调试器也可以达到同样的目的。

  • 利用可写可执行内存

       有些程序可能由于配置的问题或者其他原因,在进程中存在可读可写可执行的区域。如果攻击者可以将shellcode写入这部分空间中并劫持流程,就可以绕过DEP。

  • 利用TEB突破DEP(局限于XP SP2以下的版本)
  • 利用WPN与ROP技术

  • 利用SEH 

5 地址随机化(ASLR)

5.1 基本原理

       ASLR(地址空间布局随机化)技术的主要功能是通过对系统关键地址的随机化,防止攻击者在堆栈溢出后利用固定的地址定位到恶意代码并加以运行。它主要对以下四类地址进行随机化:堆地址、栈基址、PE文件映像基址、PEB地址。

       适用范围:Windows Vista,Windows 2008 server,Windows 7下是默认启用。

5.2 绕过方法

  • 覆盖部分返回地址

       虽然模块加载基地址发生变化,但是各模块的入口点地址的低字节不变,只有高位变化。部分返回地址覆盖,可以使得覆盖后的地址相对于基地址的距离是固定的,可以从基地址附近找可以利用的跳转指令。这种方法的通用性不是很强,因为覆盖返回地址时栈上的Cookie会被破坏。不过具体问题具体分析,为了绕过操作系统的安全保护机制需要考虑各种各样的情况。

  • 利用未开启ASLR的模块

       在未受ASLR保护的模块中查找跳转指令的地址来覆盖返回地址或者SEH结构,可以通过Process Explorer或者ImmDbg命令插件来查看哪些可执行模块未受ASDL保护。

  • HeapSpray技术

你可能感兴趣的:(Windows内存保护机制及绕过方法)