首页
社区
课程
招聘
[原创]0day:动手从堆中绕过SafeSEH保护
发表于: 2018-6-7 22:20 3949

[原创]0day:动手从堆中绕过SafeSEH保护

2018-6-7 22:20
3949

好多年前就买了0day第二版,尝试看了几次基本看了一半就啃不下去了,后来慢慢接触android逆向,然后回过头来重新翻看0day,让自己静下心来一个个实验动手做下来,终于啃到了SafeSEH和DEP,于是将自己的一些读书心得整理如下,大牛见笑,有错误之处还望多多指正,不甚感激。

SafeSEH的基本原理比较简单,即在调用异常处理函数之前,对要调用的异常处理函数进行一系列的有效性校验,如果发现异常处理函数不可靠(被覆盖了或被篡改了),立即终止异常处理函数的调用。

Visual Studio 2003和后续版本默认是启用SafeSEH功能的,通过VS2008的命令行工具中输入dumpbin /loadconfig命令查看,可以明显看到,VC++6.0和VS2008编译后的S.E.H表的区别:


首先在VS2008中,将默认开启的优化选项关闭,如下:

代码解释:

编译release版本后,运行,会提示报错,然后点击“调试”,调出OD(记得将OD设置为默认调试器),会中断在int 3处,如下:

此时可以看到EIP的地址为0x003928B8(这个地址会因机器不同有所不同),即为shellcode的起始地址。

然后下面是个循环,其实就是将shellcode挨个放入堆中,F8跟着走几次就会看到,如下图:

然后我们这个循环之后下个断点,可以看到SEH Chain的信息:

由此可以知道0x0012FFB0为next SEH的指针,而异常处理函数指针是位于0x0012FFB0+4处(即0x0012FFB4),如下图:

接着我们在0x4010F8处按F7进入这个函数,发现又有一个循环,同样F8发现,shellcode会将SEH Chain进行覆盖,我们在该循环之后下个断点,然后查看0x0012FFB4处已成功被覆盖为shellcode的起始地址0x003928B8,如下:

然后我们发现shellcode的起始字符串FC686A0A的地址为0x0012FE8C(不同机器,可能地址会有所不同),如图:

于是我们基本通过计算可以得知,0x12FFB4-0X12FE8C,共有296个字节空间,加上我们shellcode的起始地址0x3928B8 4个字节,只需要300个字节即可完成绕过,因此shellcode构造如下:

168个字节的弹框机器码(\xFC\x68\x6A\x0A...)+128个字节的nop填充(\x90\x90\x90...)+4个字节的shellcode起始地址(\xB8\x28\x39\x00)

然后我们将代码中__asm int 3这行注释掉,重新编译release,运行,对话框弹出成功:

 
 
 
 
 
 
 
 
 

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

最后于 2019-2-2 14:05 被admin编辑 ,原因: 图片本地化
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 300
活跃值: (2342)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主分享,mark
2018-6-8 14:42
0
游客
登录 | 注册 方可回帖
返回
//