设计SafeSEH保护机制的目的,为了防止攻击者通过覆盖堆栈上的异常处理函数句柄,从而控制程序执行流程的攻击。
在突破safeseh的方法有多种,在此简单介绍一下利用堆突破safeseh的方法。
微软在设计SafeSeh机制时,只会检测Seh Handler在不在栈里面而没检查在不在堆里面。
所以我们可以利用这一点对safeseh进行突破。
在利用这种方法之前,程序中必须有一个栈溢出的机会,像平常一样把Handler的数据覆盖。
不过这次是将Handler的数据覆盖成shellcode在堆中的地址。
也就是说需要程序在栈中和堆中同时接收我们的shellcode。
本实验中采取了《0day安全:软件漏洞分析技术(第二版)》中的shellcode进行,需要在DEP关闭的情况下进行。
如下图:
接下来我们需要构造一个带有缓冲区溢出的函数,如下:
为了让操作系统能顺利调用异常处理函数,我们需要在函数中构造一个异常语句。
本次实验中利用“1/0”的方式构造异常。
在操作系统遇到异常时,就会去调用异常出理函数。
因为我们利用shellcode把异常处理函数的地址覆盖,所以操作系统就会去调用我们的shellcode。
这样我们就可以顺利的控制EIP了(这也是所有黑客攻击的最终目的)。
在vs2010的release模式下编译后,利用OD加载生成的EXE文件,如图:
接下来我们要对生成的EXE文件的wmain函数进行跟踪并在wmain处下断点(在此要求读者先熟悉OD的基本操作)。
当程序运行到004010B1处时,如图:
这时我们看到已经成功申请到了一个500字节的堆空间,EAX中为堆空间的首地址(也就是我们用来覆盖Seh Handler的地址)。
随后我们需要跟进存在缓冲区溢出的test函数,待字符串拷贝完后,查看test函数的栈空间
接下来直接F9,奇迹出现了:
在调试时,需要注意堆的首地址。
在不同机子上,申请的堆的首地址不同,所以读者需要将shellcode末尾的出的地址改成申请的堆的首地址。
本文始发于微信公众号(T00ls):利用堆首绕过微软的safeseh保护机制
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论