利用堆首绕过微软的safeseh保护机制

  • A+
所属分类:安全文章

设计SafeSEH保护机制的目的,为了防止攻击者通过覆盖堆栈上的异常处理函数句柄,从而控制程序执行流程的攻击。

在突破safeseh的方法有多种,在此简单介绍一下利用堆突破safeseh的方法。


微软在设计SafeSeh机制时,只会检测Seh Handler在不在栈里面而没检查在不在堆里面。

所以我们可以利用这一点对safeseh进行突破。


在利用这种方法之前,程序中必须有一个栈溢出的机会,像平常一样把Handler的数据覆盖。

不过这次是将Handler的数据覆盖成shellcode在堆中的地址。

也就是说需要程序在栈中和堆中同时接收我们的shellcode。


本实验中采取了《0day安全:软件漏洞分析技术(第二版)》中的shellcode进行,需要在DEP关闭的情况下进行。

如下图:

利用堆首绕过微软的safeseh保护机制


接下来我们需要构造一个带有缓冲区溢出的函数,如下:

利用堆首绕过微软的safeseh保护机制

为了让操作系统能顺利调用异常处理函数,我们需要在函数中构造一个异常语句。

本次实验中利用“1/0”的方式构造异常。


在操作系统遇到异常时,就会去调用异常出理函数。

因为我们利用shellcode把异常处理函数的地址覆盖,所以操作系统就会去调用我们的shellcode。

这样我们就可以顺利的控制EIP了(这也是所有黑客攻击的最终目的)。


在vs2010的release模式下编译后,利用OD加载生成的EXE文件,如图:

利用堆首绕过微软的safeseh保护机制


接下来我们要对生成的EXE文件的wmain函数进行跟踪并在wmain处下断点(在此要求读者先熟悉OD的基本操作)。

当程序运行到004010B1处时,如图:

利用堆首绕过微软的safeseh保护机制

这时我们看到已经成功申请到了一个500字节的堆空间,EAX中为堆空间的首地址(也就是我们用来覆盖Seh Handler的地址)。


随后我们需要跟进存在缓冲区溢出的test函数,待字符串拷贝完后,查看test函数的栈空间

利用堆首绕过微软的safeseh保护机制


接下来直接F9,奇迹出现了:

利用堆首绕过微软的safeseh保护机制

在调试时,需要注意堆的首地址。

在不同机子上,申请的堆的首地址不同,所以读者需要将shellcode末尾的出的地址改成申请的堆的首地址。


本文始发于微信公众号(T00ls):利用堆首绕过微软的safeseh保护机制

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: