SEH, SAFESEH相关
SEH, SAFESEH相关
1,触发seh异常
让目标程序Read/Write无效地址,如果和栈底相邻的内存只读,尝试覆盖超出栈底
2,如何找到(显示)要覆盖的SEH
od语法:dd fs:[0]
softice语法: dd fs:0
3,覆盖SEH时需要填充的跳转地址
需要找一个可以跳转成功的
pop ?
pop ?
retn
的代码地址。
od语法:Ctrl+B/L 5? 5? c3
softice语法:s -a addr -L length 5? 5? c3
其中"5?"代表"58-5F"之间的任意值
4,ntdll!KiUserExceptionDispatcher()流程
VEH <-- winxp才有
↓
SEH <-- win2000从这里开始
↓
UEF 当程序被调试时,UnhandledExceptionFilter() SetUnhandledExceptionFilter()
5,ntdll!KiUserExceptionDispatcher()检查SEH handler过程
1) 检查handler是否在线程TEB指定的Stack范围内(fs:[4]~fs:[8]),如果在其中,拒绝执行.
2) 检查handler是否在已加载模块列表(exe和dll), 如果handler不在这些模块地址范围内,执行.
3) 如果handler在模块地址范围内,开始检查已注册异常处理程序列表.
检查过程:
--------------
a) if((DLLCharacteristics&0xFF00) == 0x0400), 拒绝执行(No SEH);否则,继续检查.
b) Load Configuration Directory地址为0(即不存在Load Configuration Directory结构,说明编译时没有设置/safeseh选项),停止检查,执行.
Load Configuration Directory结构存在,继续检查:
+00h directory_size // 目录长度介于[0,0x48),停止检查,执行.
...
+40h handlers[] // SEH handler数组指针(元素是SEH handler RVA地址),if(handlers[]==0),停止检查,执行.
+44h handler_num // SEH handler数组元素个数,if(handler_num==0),停止检查,执行.
c) 然后开始逐个匹配,发现匹配,调用;没有发现匹配,拒绝调用.
6,关于DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]
这个是在winnt.h中的定义
typedef struct {
DWORD Size;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD GlobalFlagsClear;
DWORD GlobalFlagsSet;
DWORD CriticalSectionDefaultTimeout;
DWORD DeCommitFreeBlockThreshold;
DWORD DeCommitTotalFreeThreshold;
DWORD LockPrefixTable; // VA
DWORD MaximumAllocationSize;
DWORD VirtualMemoryThreshold;
DWORD ProcessHeapFlags;
DWORD ProcessAffinityMask;
WORD CSDVersion;
WORD Reserved1;
DWORD EditList; // VA
DWORD SecurityCookie; // VA
DWORD SEHandlerTable; // VA
DWORD SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
SEHandlerTable 是指向一个Seh处理函数Rva的表格。SEHandlerCount是这个表格的长度。如果这个表格存在,那么只有该表格中的Seh处理函数才是合法的处理函数。如果异常发生时,顺序查找并执行Fs:[0]中的处理函数时,如果认为当前函数非法,则Seh无法继续执行,程序会中止。而且连 UnhandledExceptionFilter都无法执行到。除非PE在被调试,依靠调试器来恢复。
每个PE有一个单独表格。如kernel32.dll和user32.dll有各自的表格。当PE被载入时,PE的基址,大小、 SEHandlerTable(表格的地址)、SEHandlerCount(长度)会被存在一个表格中。当一个异常发生时,系统每个PE的基址和大小检查当前seh处理函数属于哪一个PE,然后取出相应的表格地址和长度。由于是载入时就已经取出,载入后SEHandlerTable和 SEHandlerCount就没什么用处了,对它进行修改当然也没什么用了。但修改表格内容还是有效的。
如果seh处于动态申请的内存中,因为不处于任何一个PE Image内,所以seh是没有任何限制的,否则如果不在相应表格中,会导致PE中止。visual c++的try..catch等的seh处理函数会自动加入该表格。但如果使用inline asm对fs:[0]进行操作加seh是无效的,如果发生异常只会导致PE中止。
目前基本所有的壳软件都是将loadconfig删除,对该PE基本没什么影响。但如果要保留的话,则需要将Pe Image内的seh处理函数加入到该表格中。微软称这个表格中的处理函数为"safe handler",
关掉safe handler的开关在Liker|CommandLine 加入/SAFESEH:NO
尝试动态修改内存中的SEHandlerTable,except_handler顺利得到控制权.
7,针对Win2003/WinXP SP2对SEH handler(异常处理函数)地址的突破方法
1) 不在stack里面, 在heap里.
对IE等浏览器,用js等heapspray分配堆,用堆内地址覆盖SEH handler.
2) 在已加载模块的范围外.
用代码页的跳转地址,比如0x7FFA1571(win2000/xp/2003 chs通用地址)
3) 在系统dll里面,且是该dll注册过的异常处理函数.
利用已注册的SEH handler,利用性不大.
8,OD的safeseh插件OllySSEH
用其分析已加载模块,查看哪些DLL是/SafeSEH OFF:
/Safeseh ON 只能选已注册的SEH handler地址来跳.
/Safeseh OFF 可以选里面的地址(pop/pop/ret地址)来跳.
No SEH (DLLCharacteristics&0xFF00) == 0x0400, 不能跳.
下载地址:http://www.openrce.org/downloads/details/244/OllySSEH
SEH, SAFESEH相关的更多相关文章
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...
- 深入研究 Win32 结构化异常处理(好多相关文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- 深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态
KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 <寒江独钓>内核学习笔记(5) 继续我们的线程相关的数据结构的学习.接下来我们学习 KTH ...
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)
文章目录: 1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- 第23章 SEH结构化异常处理(1)_系统SEH机制
23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...
- safeseh+dep保护绕过
[文章作者] :h_one [漏洞程序名称]:mplayer.exe [漏洞类型] :缓冲区溢出 [保护方式] :safeseh+dep [操作平台] ...
- 内存保护机制及绕过方案——通过覆盖SEH异常处理函数绕过/GS机制
通过SEH链绕过GS保护机制 ⑴. 原理分析: i.异常处理结构(SEH)处理流程如下: SEH是基于线程的,每一个线程都有一个独立的SEH处理结果,在线程信息块中的第一个结构指向线程的异常列表,F ...
随机推荐
- DLL Injection and Hooking
DLL Injection and Hooking http://securityxploded.com/dll-injection-and-hooking.php Three Ways to Inj ...
- OpenCV使用FLANN进行特征点匹配
使用FLANN进行特征点匹配 目标 在本教程中我们将涉及以下内容: 使用 FlannBasedMatcher 接口以及函数 FLANN 实现快速高效匹配( 快速最近邻逼近搜索函数库(Fast Appr ...
- vim/vi的文件内、跨文件复制粘贴操作、替换操作
vi/vim 中可以使用 :s 命令来替换字符串 1.s/vivian/sky/ 替换当前行第一个 vivian 为 sky 2.:s/vivian/sky/g 替换当前行所有 vivian 为 sk ...
- Struts2数据验证机制
1. 手动验证的实现 只需要在继承ActionSupport类的情况下,直接重写validate()方法即可.使用validate()方法可以对用户请求的多个Action方法进行验证,但其验证的逻辑是 ...
- utf8_general_ci、utf8_unicode_ci和utf8_bin的区别
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用. utf8_general_cs 区分大小写,如果用户名和邮箱用这个就会照成不良后果. utf8_bin: com ...
- go语言基础之多个defer执行顺序
1. 多个defer执行顺序 如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行.哪怕函数或某个延迟调用发生错误,这些调用依旧会被执.示例: package main //必须 ...
- 分别用Java和JS读取Properties文件内容
项目中经常用到的配置文件,除了XML文件之外,还会用到Properties文件来存储一些信息,例如国际化的设置.jdbc连接信息的配置等.有时候也会把一些路径或者sql语句放到Properties中, ...
- js执行eval()抛出异常SyntaxError
try{ eval("("+data+")"); }catch(err) { location.href = window.location.href; }
- RS导出Excel交叉表角对应的列占用多列问题
在Cognos报表展示的时候,很多用户为了计算会把数据报表导出成excel然后再做统计,于是乎我做的一张报表导出成Excel的时候就出现了这样的问题 从上图可以看出交叉表角对应的列 ‘一级手术’和‘二 ...
- (转)LIB和DLL的区别与使用
共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.一种是LIB包含函数 ...