Windows安全机制---异常处理保护:Safe机制
文章目录
Windows安全机制
微软关于内存保护机制
- GS编译技术
- SEH的安全校验机制
- Heap Cookie,Safe Unlinking等一系列堆安全机制
- DEP数据执行保护
- ASLR加载地址随机
- SEHOP SEH的覆盖保护
异常处理保护:SafeSEH
原理
SafeSEH需要编译器在编译PE文件时进行特殊支持才能发挥作用。在程序调用异常处理前,对调用的异常处理函数进行校验。同GS机制一样,在启用链接选项后,会将所有的异常处理函数提取出来,编入一张安全SEH表,并放到程序的映像里。在调用异常处理函数时与这个表进行匹配。
RtlIsValidHandler() 函数的校验流程
一些运行异常处理函数执行的情况:
- 若 DEP 关闭,则只要在当前模块的内存范围之外找一个跳板,就能转入 shellcode 执行
- 可以在加载模块中找一个没有启用 SafeSEH 的模块,用这个未启用 SafeSEH 模块里的指令作为跳板,转入 shellcode 执行
- 可以考虑清空 SafeSEH 表以欺骗 OS,或者将自己的函数地址注入到 SEH 表中。
- 如果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
原理
- 首先编译一个不使用SafeSEH的动态链接库NO_Safe.dll
- 而Safe.exe有溢出漏洞
- 使用NO_Safe.dll中的pop pop retn指令地址覆盖异常处理函数地址,执行完pop pop retn指令后会执行shellcode
- 制造除0的异常,进入异常处理,跳过本来的SafeSEH机制
插件
OllySSEH—查看加载模块的SafeSEH情况
- /SafeSEH OFF:未启用
- /SafeSEH ON:启用
- NO SEH:不支持,即异常被忽略无法利用
- Error:读取错误
步骤