← 返回首页

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

作者:007007
发布时间:2013-12-16 14:04:41
浏览:12573    评论:30

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

2013-12-16 14:04:41 30 12573


设计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末尾的出的地址改成申请的堆的首地址。
                                                                (在此,感谢技术大神:宇兄、然哥、范哥的指导)
类别 逆向破解

关于作者

0070074篇文章11篇回复