首页
社区
课程
招聘
[原创]利用SEH异常处理机制绕过GS保护
发表于: 2017-12-21 09:41 16193

[原创]利用SEH异常处理机制绕过GS保护

2017-12-21 09:41
16193

实验环境:Win7 sp1 x64

实验工具:vs2013 ImmunityDebug mona.py

本节内容需要了解两个概念,一个是 Windows 异常处理机制(seh),还有一个就是 GS保护.

SEH:

(Structured Exception Hadnling)结构化异常处理 是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器

C语言中通常通过_try catch 来实现

int main()
{
    _try{
           //可能出现异常崩溃的代码
       }
   _except(EXCEPTION_EXECUTE_HANDLER) {
           //异常处理程序
       }
   return 0;
}

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

GS保护机制:

        Windows在VS7.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++虚表指针来控制程序流程     #msvcrt 采用进程堆后失效

3)  用一些未开启GS安全保护的函数进行溢出(可能是关键字保护) ||小于四字节的Buf

程序很简单,读取文件来还原溢出场景,我将print函数放在了ReadFile下面,可以看到在ShowFileInfo中Printf函数下面有一个Security_Check_Cookie 这就是我们的GS缓冲区检测机制的这个函数,工程项目是realse版本的,在项目属性只开启GS。关闭 优化选项,dep,aslr,safeseh(vs项目属性选择配置属性->链接器->命令行填写“/SAFESEH:NO ”)



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
2
2017-12-21 19:13
0
雪    币: 1348
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看完
2017-12-23 08:56
0
雪    币: 7
活跃值: (240)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
4
溢出了,seh也覆盖了,可是调试器不用栈里的SEH,直接TerminateProcess怎么办...
大佬指点下
2018-4-29 15:57
0
雪    币: 1196
活跃值: (73)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
某字哮天 溢出了,seh也覆盖了,可是调试器不用栈里的SEH,直接TerminateProcess怎么办... 大佬指点下
我也遇到了同样的问题,请问楼上问题解决了吗?谢谢!
2018-12-19 20:50
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark'
2021-5-8 11:12
0
雪    币: 51
活跃值: (177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Triangleowl 我也遇到了同样的问题,请问楼上问题解决了吗?谢谢!
Windows版本太高了?win xp sp2以后引入了safeSEH机制,会对异常处理函数进行校验。
2021-5-9 17:48
0
游客
登录 | 注册 方可回帖
返回
//