Windows安全机制---异常处理保护:Safe机制

Windows安全机制

微软关于内存保护机制

  • GS编译技术
  • SEH的安全校验机制
  • Heap Cookie,Safe Unlinking等一系列堆安全机制
  • DEP数据执行保护
  • ASLR加载地址随机
  • SEHOP SEH的覆盖保护

异常处理保护:SafeSEH

原理

SafeSEH需要编译器在编译PE文件时进行特殊支持才能发挥作用。在程序调用异常处理前,对调用的异常处理函数进行校验。同GS机制一样,在启用链接选项后,会将所有的异常处理函数提取出来,编入一张安全SEH表,并放到程序的映像里。在调用异常处理函数时与这个表进行匹配。
Windows安全机制---异常处理保护:Safe机制
RtlIsValidHandler() 函数的校验流程

一些运行异常处理函数执行的情况:

  1. 若 DEP 关闭,则只要在当前模块的内存范围之外找一个跳板,就能转入 shellcode 执行
  2. 可以在加载模块中找一个没有启用 SafeSEH 的模块,用这个未启用 SafeSEH 模块里的指令作为跳板,转入 shellcode 执行
  3. 可以考虑清空 SafeSEH 表以欺骗 OS,或者将自己的函数地址注入到 SEH 表中。
  4. 如果SEH中的异常函数指针指向堆区,也可以绕过SafeSEH机制
绕过
攻击返回地址

前提:启用了SafeSEH未启用GS,直接覆盖返回地址

利用虚函数绕过

不涉及异常处理的事

从堆中绕过
#include<stdafx.h>
#include<stdlib.h>
#include<string.h>
char shellcode[]="";
void test(char * input)
{
	char str[200];
	strcpy(str,input);
	int zero=0;
	zero=1/zero;
}
void main()
{
	char * buf=(char *)malloc(500);
	__asmint 3
	strcpy(buf,shellcode);
	test(shellcode);
}

shellcode在堆中,只需要用在堆的shellcode的起始地址覆盖异常处理的函地址就可以绕过SafeSEH。

利用未启用SafeSEH模块绕过SafeSEH

原理

  1. 首先编译一个不使用SafeSEH的动态链接库NO_Safe.dll
  2. 而Safe.exe有溢出漏洞
  3. 使用NO_Safe.dll中的pop pop retn指令地址覆盖异常处理函数地址,执行完pop pop retn指令后会执行shellcode
  4. 制造除0的异常,进入异常处理,跳过本来的SafeSEH机制

插件
OllySSEH—查看加载模块的SafeSEH情况

  • /SafeSEH OFF:未启用
  • /SafeSEH ON:启用
  • NO SEH:不支持,即异常被忽略无法利用
  • Error:读取错误

步骤

利用加载模块之外的地址绕过
利用ActiveX控件绕过SafeSEH