利用堆首绕过微软的safeseh保护机制
设计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末尾的出的地址改成申请的堆的首地址。
(在此,感谢技术大神:宇兄、然哥、范哥的指导)
评论30次
算了吧 本来我也想吐槽的 但是看到2楼的 管理02 以及lz后面的红字还有后面的灌水以及没有实战的方法 对着书照着实验我就不想说什么了 你认为你的解释他们会明白吗? 我都觉得 没必要上星期写完,本来我还想放一个 rop链构造的文章 想想算了 反正也没人有兴趣到时 管理又来这么一篇文章╮(╯▽╰)╭等有时间就拿出来当笔记吧 呵呵有些东西的价值 也就只有知道的人才知道 最重要的就是正视自己 找到自己的位置 才能不做没必要的牺牲heapspray 感觉都快要淘汰了╮(╯▽╰)╭ 虽然利用方法相对简单 但是还是很有缺陷的win8+IE10 那个poc 就已经没有用 heapspray 了 顺畅的很 感觉这就是未来了 呵呵binval 好像不错的样子 但是好像没什么更新了果然玩这个的都是孤独的 没事的时候就像lz这样放出来科普科普就很不错了 也不是认真的然后管理再推广推广 最后只能微微一笑了 这样也蛮不错的 如果都能轻松开心的话 没必要去分析这样枯燥的东西你说呢?
本来还想吐槽下这玩意没啥用,突然看到是13年的帖子,,,
辛苦了。。。
这是0day安全 的实验吧,没记错的话
看不懂,但是还是得回复下。
好啊 支持。。。
对于xi统底层的 太菜了
THX,受教了。
mark~学xi了
学xi 学xi了 很经典
good job 非常实用,谢谢~
我无恶意,只是看了标题和内容一下感觉落差很大。能发东西的人都是值得尊重的,xi望继续,拭目以待。
这些东西我也两三年没弄了,倒是期待看看你的文章。
既然大神和管理员都想来点实战类型的,那我就下来就完整的分析、调试一下CVE-2010-3333漏洞。也许大神会说,这是很久之前的漏洞,没什么价值!但如果放到网上,还是具有攻击性的! 对于我接下来的文章,我只想说两点: 第一、我得文章只适合新手,大牛请绕道。 第二、也许你对“1+1=2”这种简单的算数题很不屑,但是每一个数学天才,都是从做“1+1=2”开始的。简单只是个起点,而非终点~~~
大神对这篇文章定位错了,我之所以写这篇文章,是想给反汇编的新手做个参考。毕竟学xi需要一步一步来,你作为一个技术牛,也应该考虑一下新手的感受!我上来就讲堆喷射的话,有几个新手能看懂?其实绕过SAFESEH的方法有很多种,我之所以选这个无非是好理解,好操作~
算了吧 本来我也想吐槽的 但是看到2楼的 管理02 以及lz后面的红字还有后面的灌水 以及没有实战的方法 对着书照着实验 我就不想说什么了 你认为你的解释他们会明白吗? 我都觉得 没必要 上星期写完,本来我还想放一个 rop链构造的文章 想想算了 反正也没人有兴趣 到时 管理又来这么一篇文章╮(╯▽╰)╭等有时间就拿出来当笔记吧 呵呵 有些东西的价值 也就只有知道的人才知道 最重要的就是正视自己 找到自己的位置 才能不做没必要的牺牲 heapspray 感觉都快要淘汰了╮(╯▽╰)╭ 虽然利用方法相对简单 但是还是很有缺陷的 win8+IE10 那个poc 就已经没有用 heapspray 了 顺畅的很 感觉这就是未来了 呵呵 binval 好像不错的样子 但是好像没什么更新了 果然玩这个的都是孤独的 没事的时候就像lz这样放出来科普科普就很不错了 也不是认真的 然后管理再推广推广 最后只能微微一笑了 这样也蛮不错的 如果都能轻松开心的话 没必要去分析这样枯燥的东西 你说呢?
学xi了。 支持一下
@t00ls管理团队02 @核攻击 拜托大家在赞的时候真的好好考虑下:首先,seh在栈上,堆是在堆上,一个溢出哪里可能同时精准的把shellcode同时既推送到堆上和栈上。为什么heapspray现在还能蹦达下,就因为海量的复制堆造成的,返回地址为堆区间的地址,结果返回后落入堆里。和这里的例子没有半点关xi。 这个例子之所以能成功,是因为人为的在代码里同时把shellcode即复制到堆里又复制到栈里。现实情况下哪有这样的好事??
思路不错, 搞逆向溢出都是大牛~