实验环境: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 ”)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)