请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

梦织未来

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1488|回复: 15

二进制漏洞挖掘系列课程-(2)利用SEH绕过GS安全机制

[复制链接]

升级   100%

12

主题

5

精华

46

积分
发表于 2016-12-14 21:10:43 | 显示全部楼层 |阅读模式
本帖最后由 冠7 于 2016-12-17 17:10 编辑

实验环境:Win7 sp1 x64
实验工具:vs2013 ImmunityDebug mona.py
---------------------------------------------------------------------------------------------------------------------------
这个专题需要了解两个概念,一个是异常处理机制(seh),还有一个就是Windows GS保护.
SEH:
Structured Exception Hadnling)结构化异常处理
(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器
C语言中通常通过_try catch 来实现
int main()
{
    _try{
           //可能出现异常崩溃的代码
       }
   _except(EXCEPTION_EXECUTE_HANDLER) {
           //异常处理程序
       }
   return 0;
}

其实Windows在原始的程序栈前面添加了一个异常处理结构,该结构由一系列的异常处理链表组成,这条链表的起始点总是放在TIBThread Information Block的第一个成员中,在x86计算机中存储在FS:[0]寄存器中。链表的最后总是默认处理程序,这个默认处理程序的指针总是0xFFFFFFFF


1.png
      GS保护机制:
        WindowsVS7.0(Visual Studio 2003)及以后版本的VisualStudio中默认启动了一个安全编译选项——GS(针对缓冲区溢出时覆盖函数返回地址这一特征)
        GS保护机制是在函数即将调用的时候向栈桢压入一个DWORD的随机值,同时也向.data段中存放一个Security Cookies,
        1.   被压入栈中的随机值位于EBP之前..data段中的数据实现栈Cookies的校验
        2.   在函数返回之前,系统将会执行一个额外的安全验证操作,被称作SecurityCheck
        3.   Security当校验发现栈Cookies .data的副本不吻合则表明发生溢出
        4.   当检测到栈中发生溢出时,系统接管异常,函数不会被正常返回,ret指令也不会被执行
        5.    当栈中发生溢出时,Security Cookie将被首先淹没,之后才是EBP和返回地址

         GS保护机制的实现细节是
         1.    系统以.data段的第一个DWORD 作为Cookie的种子
         2.    每次程序运行时的Cookie的种子都不一样,随机性很强
         3.    栈桢初始化完毕后用EBP异或种子,作为当前函数的Cookie,以此区别不同函数,增强Cookie的随机性
        4.    在函数返回前,EBP异或还原出Cookie种子
绕过GS安全保护的方案
1)       通过覆盖SEH链表来阻止系统接管异常处理.
2)       通过改写C++虚表指针来控制程序流程
3)       用一些未开启GS安全保护的函数进行溢出(可能是关键字保护) ||小于四字节的Buf
今天这个课程我们讲通过覆盖SEH链表来进行exploit

还是上节课的例子,我们开始调试在反汇编窗口查看ShowFileInfo 这次为了演示seh我把print函数放在了ReadFile下面我们这次看到了在ShowFileInfoPrintf函数下面有一个Security_Check_Cookie 这就是我们的GS缓冲区检测机制的这个函数,工程项目是realse版本的,在项目属性只开启GS。关闭 优化选项,dep,aslr,safeseh(vs项目属性选择配置属性->链接器->命令行填写“/SAFESEH:NO ”)



2.png

我们可以试试如果和上次一样覆盖掉返回地址当执行到Security_Check_Cookie的时候,他会检查栈Cookies .data的副本,这时候GS就分发系统异常处理请求然后就由系统接管处理你这个异常

3.png

可以用mona插件查看程序当前seh链表


4.png
这个地址指向的就是Pointer to next SEHrecord 下面的SE handerntdll中的系统接管处理。
我们现在的思路就是覆盖掉这个SEH异常处理链表SEH handler 还需要18*4个字节才能覆盖掉我们用mona生成一个1024+72字节的字符串.命令行参数重新载入不要忘了 Imdebug加参数
可以看到已经覆盖掉了SEH handler
5.png

我们继续单步到Printf 看到了参数已经被我们覆盖掉了

6.png

我们继续单步步过这个call printf,看到程序会出现异常处理,我就不截图了,接着按shitf+f9就到了我们的异常处理这里,可以看到程序已经飞了,此时的eip正是这个se handler 也是我们覆盖的数据


7.png

接下来就是寻找个跳板了,seh通常利用的是pop pop ret 一旦进入异常处理,就会把Pointer to next SEH的这个地址压入栈中进行系统处理,通过pop pop然后这个地址ret到我们的eip,因为Pointer to Next..是可控的所以我们控制这个地址来控制eip,然后就是可以通过mona来找pop pop ret 来覆盖Se handler


8.png

找到这一行PAGE_EXECUTE_READ,后面的保护机制都是false
Address=00401804 Message= 0x00401804 : pop edi # pop esi # ret | startnull,ascii {PAGE_EXECUTE_READ} [利用Seh绕过GS保护.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0-(C:\Users\Administrator\Documents\Visual Studio 2013\Projects\利用Seh绕过GS保护\Release\利?找到一个ppr的地址我们打开十六进制编辑器以小端存储将尾部四个字节覆盖掉

9.png


10.png

我们已经知道了当执行完我们的pop popret 会把上一个函数的地址弹到eip中我们这个地址也是我们可以控制的. 我们在Pointer to next SEH record地址做一个跳板跳转至我们的shellcode中但是当前地址已经离栈底很近了,所以我们要把shellcode放置在我们的buf中,向上跳。但是这里还有一个细节就是当你向上跳转的时候是jmp一个负的地址 那么这条jmp XXXX 这条指令就会撑爆当前的这四个字节空间,覆盖掉了后面的se handler数据,所以我们要先在下面找到一个比较近的一块空区域然后在那块区域的地址上写上我们jmp shellcode的指令.我们选择 0018FF8O这个地址
现在我们加长我们的文本,可以看到下图中, 现在搜索我们的pop pop ret指令,反汇编窗口ctrl+G 输入00401804在然后再pop上下断点,shitf+f9运行观察eip,当执行完ret指令后的当前指令修改为jmp 0018FF80


11.png

12.png

上图是覆盖Pointer to NextRecord为jmp 0018FF80为向下跳转,单步一步,然后这里需要一个向上跳转的jmp这里就用我们文本的第一个字节作为shellcode起始位置0018FF80                          jmp 0018FF80的二进制是 E9 B3 FB FF


13.png

此时0018FF80地址处的指令就是jmp 0018FF80 单步就到了我们的buf头了


14.png

可以看到我们覆盖的数据了,二进制是这样的


15.png

接下来我们就在buf中扣一段shellcode0018FF80这里写指令跳到它的首地址直接用第一个字节的地址 0018FB38


16.png
17.png

现在我们总结出了一个过程:  
1.找到SEH处理函数, 寻找跳板pop pop ret来覆盖掉ntdll中的seHandler                                       
2. 构造跳板跳向shellcode,字节长度问题可以在seHandler下方找跳板间接找跳板跳向shellcode            
注意事项:在实验的时候当你在pop pop ret下断点的时候,在程序开始会断下,需要跑几次配合shift+F9来观察堆栈数据和eip指向.

本课教程整理自视频:  链接: http://pan.baidu.com/s/1nuOTzqp 密码: kns7欢迎加入DisAsm 交流群:104132152


利用Seh绕过GS保护.zip

10 KB, 下载次数: 17

回复

使用道具 举报

升级   93.33%

4

主题

1

精华

190

积分
发表于 2016-12-14 21:54:45 | 显示全部楼层
15pb出来的果然厉害。把VMP那部分透露一点出来就非常感谢了!(*^__^*) 嘻嘻……
哎...今天够累的,签到来了...
回复 支持 反对

使用道具 举报

升级   100%

199

主题

64

精华

1426

积分
发表于 2016-12-14 22:00:55 | 显示全部楼层
谢谢分享,讲解的很细致。

微软的safeseh还是很nice的,让劫持seh的方法都失效了- -
回复 支持 反对

使用道具 举报

升级   79.33%

17

主题

0

精华

169

积分
发表于 2016-12-14 22:10:17 | 显示全部楼层
看到2L说的15PB 我就服气了 mark 以后来看 学无止境~
回复 支持 反对

使用道具 举报

升级   100%

199

主题

64

精华

1426

积分
发表于 2016-12-14 22:10:34 | 显示全部楼层
GS保护机制还有两点我补充下:
1,只有某函数中出现数组才会有cookie。
2,函数中的数组会出现在cookie值的上方,这样做是为了防止溢出覆盖掉其他的临时变量。(比如某临时变量是个函数指针并且会被调用,那么覆盖掉等同会被劫持了。)
回复 支持 反对

使用道具 举报

升级   100%

12

主题

5

精华

46

积分
 楼主| 发表于 2016-12-14 22:11:33 | 显示全部楼层
mengwuji 发表于 2016-12-14 22:00
谢谢分享,讲解的很细致。

微软的safeseh还是很nice的,让劫持seh的方法都失效了- -

本想下节将SafeSeh,Safepass放在第四节讲吧  下节讲下用虚函数过GS
回复 支持 反对

使用道具 举报

升级   100%

12

主题

5

精华

46

积分
 楼主| 发表于 2016-12-14 22:14:53 | 显示全部楼层
mengwuji 发表于 2016-12-14 22:10
GS保护机制还有两点我补充下:
1,只有某函数中出现数组才会有cookie。
2,函数中的数组会出现在cookie值 ...

是的 一些其他方法也是针对某些特殊声明的函数来说的
回复 支持 反对

使用道具 举报

升级   0%

10

主题

1

精华

200

积分
发表于 2016-12-14 22:31:37 | 显示全部楼层
过来顶一下群主,多谢群主分享
回复 支持 反对

使用道具 举报

升级   100%

13

主题

3

精华

108

积分
发表于 2016-12-15 07:45:28 | 显示全部楼层
楼主厉害啊,佩服
回复 支持 反对

使用道具 举报

升级   10.67%

25

主题

6

精华

66

积分
发表于 2016-12-15 08:56:16 | 显示全部楼层
公司有一个迎接的是15pb出来的……
技术还不错。。。
回复 支持 反对

使用道具 举报

升级   100%

12

主题

5

精华

46

积分
 楼主| 发表于 2016-12-15 09:16:04 | 显示全部楼层
蓝屏 发表于 2016-12-15 08:56
公司有一个迎接的是15pb出来的……
技术还不错。。。

威客?
回复 支持 反对

使用道具 举报

升级   54%

7

主题

0

精华

27

积分
发表于 2016-12-15 11:55:06 | 显示全部楼层
好东西,收下了,谢谢
回复 支持 反对

使用道具 举报

升级   4%

1

主题

0

精华

2

积分
发表于 2016-12-18 09:14:44 | 显示全部楼层
15PB大表哥你又有钱,又帅气,认识你是我的福气
回复 支持 反对

使用道具 举报

升级   100%

12

主题

5

精华

46

积分
 楼主| 发表于 2016-12-18 11:58:42 | 显示全部楼层
与我拼搏 发表于 2016-12-18 09:14
15PB大表哥你又有钱,又帅气,认识你是我的福气

回复 支持 反对

使用道具 举报

升级   48%

8

主题

0

精华

24

积分
发表于 2016-12-19 01:11:19 | 显示全部楼层
精彩  希望LZ这个系列持续下去~~这个有意思    uaf lz也务必讲讲 谢啦!!!!!!!
回复 支持 反对

使用道具 举报

升级   10.67%

25

主题

6

精华

66

积分
发表于 2016-12-20 14:56:34 | 显示全部楼层

没去过威客;一直在甲方混。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|mengwuji ( 粤ICP备13060035号-1 )  

GMT+8, 2017-1-22 01:31 , Processed in 0.441232 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表