《0day安全》——SEH终极防护:SEHOP

原理

SEHOP 在 Windows Ser ver 2008 默认启用,而在 Windows Vista 和 Windows 7 中 SEHOP默认是关闭的。大家可以通过以下两种方法启用 SEHOP。
 1.下载 http://go.microsoft.com/?linkid=9646972 的补丁,此补丁适用于 Windows 7和Windows Vista SP1。
 2.手工在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel 下面找到DisableExceptionChainValidation项, 将该值设置为 0,即可启用 SEHOP。
在这里插入图片描述
SEHOP核心就是检查SEH链的完整性,在程序转入异常处理时会检测SEH链的最后一个异常处理函数是否为系统固定的终极异常处理函数,是就说明SEH链没被破坏,执行当前异常处理函数,否则说明SEH被破坏,可能发生了SEH覆盖攻击,程序将不会执行当前的异常处理函数。
作为对 SafeSEH 强有力的补充, SEHOP 检查是在 SafeSEH 的 RtlIsValidHandler 函数校验
前进行的,也就是说利用攻击加载模块之外的地址、堆地址和未启用 SafeSEH 模块的方法都行不通了,必须要考虑其他的出路。理论上我们还有是三条路可以走,他们分别是:
 1.不去攻击 S.E.H,而是攻击函数返回地址或者虚函数等。
 2.利用未启用 SEHOP 的模块。
 3.伪造 S.E.H 链。


攻击返回地址

启用了 SEHOP 但是未启用 GS,或者启用了 GS 但是刚好被攻击的函数没有 GS保护,直接攻击函数返回地址。


攻击虚函数

无论 SEHOP 有多么的强大,它保护的也只是 S.E.H,对于 S.E.H 以外的东西是不提供保护的。所以我们依然可以通过攻击虚函数表来劫持程序流程,这个过程不涉及任何异常处理,无论是 SafeSEH 还是 SEHOP 都只能眼睁睁地看着程序流程被劫持。


利用未启用 SEHOP 的模块

操作系统会根据 PE 头中 MajorLinkerVersion 和 MinorLinkerVersion 两个选项来判断是否为程序禁用 SEHOP。例如,我们可以将这两个选项分别设置为 0x53 和 0x52 来模拟经过 Armadilo加壳的程序,从而达到禁用 SEHOP 的目的。
搞定 SEHOP 后还需要搞定 SafeSEH,所以我们在“利用未启用 SafeSEH 模块”实验的基础上来完成本次演示。

首 先 为 SEH_NOSaeSEH_JUMP.dll 禁 用 SEHOP 。 使 用 CFF Ex plorer 打 开 SEH_NOSaeSEH_JUMP.dll 后在 Optional header 选项页中来进行设置,分别将 MajorLinkerVersion 和MinorLinkerVersion 设置为 0x53 和 0x52。
在这里插入图片描述

由于在Windows 7下PEB_LDR_DATA指向加载模块列表中第二个模块位置被KERNELBASE.dll占据, kernel32.dll 的位置由第二个变为第三个,所以我们的 shellcode 也要作出相应修改才能够正常运行。原来 shellcode 的第 52 个字节之后插入“ \x8B\x09”,该机器码对应的汇编语句为MOV ECX,[ECX]。

#include "stdafx.h"
#include <string.h>
#include <windows.h>

char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值