基础知识 SafeSEH DEP ASLR SEHOP
大多是0day书上抄的
1.SafeSEH
机制:
首先:内存中有SEH表的备份(加密过的)
在调用异常出来函数前,RtlDispatchException()函数中的行为:
Ⅰ.检查异常处理链是否位于当前程序的栈中,如果不在当前栈中,程序将终止异常处理函数的调用。
Ⅱ.检查异常处理函数指针是否指向当前程序的栈中,如图所示。如果指向当前栈 中,程序将终止异常处理函数的调用。

Ⅲ.在前面两项检查都通过后,程序调用一个全新的函数 RtlIsValidHandler(),来对异常处 理函数的有效性进行验证
RtlIsValidHandler()行为:
(1)判断程序是否设置了 IMAGE_DLLCHARACTERISTICS_NO_SEH 标识。如果设置了这个标识,这个程序内的异常会被忽略。
所以当这个标志被设置时,函数直接返回校验失败。
(2)检测程序是否包含安全 S.E.H 表。如果程序包含安全 S.E.H 表,则将当前的异常处理 函数地址与该表进行匹配,匹配成功则返回校验成功,匹配失败则返回校验失败。
(3)判断程序是否设置 ILonly 标识。如果设置了这个标识,说明该程序只包含.NET 编译 人中间语言,函数直接返回校验失败。
(4)判断异常处理函数地址是否位于不可执行页(non-executable page)上。当异常处理函 数地址位于不可执行页上时,校验函数将检测 DEP 是否开启,如果系统未开启 DEP 则返回校 验成功,否则程序抛出访问违例的异常。
如果异常处理函数的地址没有包含在加载模块的内存空间,校验函数将直接进行 DEP 相 关检测,函数依次进行如下校验。
①判断异常处理函数地址是否位于不可执行页(non-executable page)上。当异常处理函 数地址位于不可执行页上时,
校验函数将检测 DEP 是否开启,如果系统未开启 DEP 则返回校 验成功,否则程序抛出访问违例的异常。
②判断系统是否允许跳转到加载模块的内存空间外执行,如果允许则返回校验成功,否 则返回校验失败。

绕过检测的方法:
(1)异常处理函数位于加载模块内存范围之外,DEP 关闭。
(2)异常处理函数位于加载模块内存范围之内,相应模块未启用 SafeSEH(安全 S.E.H 表为空),同时相应模块不是纯 IL。
(3)异常处理函数位于加载模块内存范围之内,相应模块启用 SafeSEH(安全 S.E.H 表不为空),异常处理函数地址包含在安全 S.E.H 表中。
(4) 异常处理函数指向堆空间(原理不清楚)
2.DEP
机制:
将内存页标志为不可执行(比如说栈,.data区等)
检测:DEP是否开启的标志
_KEXECUTE_OPTIONS{
ExecuteDisable :1bit ;DEP 开启时 ExecuteDisable 位被置 1
ExecuteEnable :1bit ;DEP 关闭时 ExecuteEnable 位被置 1
DisableThunkEmulation :1bit
Permanent :1bit
ExecuteDispatchEnable :1bit
ImageDispatchEnable :1bit
Spare :2bit }
绕过:
1.Ret2Libc
解释:在加载的内存中找具有可读可写可执行属性的内存,在内存中搜索相应的指令(如pop retn),把指令地址填入栈中覆盖原跳转地址,使得程序跳到找的指令处执行。执行完再跳回到栈内的下一条执行。
例如:
①利用ZwSetInformationProcess函数修改DEP标志
方法:ntdll.dll中,LdrpCheckNXCompatibility 函数中里面刚好会调用ZwSetInformationProcess地址,设置好前置条件就可以跳过去调用它,关掉DEP(前提是LdrpCheckNXCompatibility中没用GS)
②同理利用VirtualProtect修改指定地址的内存属性,或者VirtualAlloc+memcpy,把shellcode拷贝过去。
难点:构建参数,是动态获取的,必须通过巧妙的指令,使得参数的地址刚好可以调用shellcode的地址
必须保证调用函数前参数刚好在ESP
一些指令:
pop ret
push esp pop ebp ret
call [esp+-n]
call [ebp+-n]
retn :加esp
push esp pop esi retn == pop eax retn + push esp jmp eax (eax里面是 pop esi retn 地址)
③利用内存中已存在的拥有可读可写可执行属性内存。
3.ASLR
机制:
1.内存映射地址随机化(每次系统重启时改变)
2.PEB,TEB地址随机化
应对:
1.利用未随机化的模块作为跳板
2.栈内相对偏移未改变,可以修改地址的最后两个字节使得有限度的跳转
3.先跳到某个空闲位置,如0x0C0C0C0C(自己设置),使用堆喷射覆盖
4.SEHOP
机制:在异常处理前,遍历SEH链,直到最后一项(终极异常处理)

检查流程:

应对:
注:不考虑SafeSEH,ALSR等其他保护
伪造终极SEH(必须四字对齐且在栈内) 使得当前栈中异常链的指针指向伪造的SEH(end of SEF chain,保存0xFFFFFFFF)
5.利用方式总结:
栈溢出:retn,ESH,虚函数,总之一切带跳转的都能利用,根据实际情况。
基础知识 SafeSEH DEP ASLR SEHOP的更多相关文章
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- CentOS 7 搭建Cobbler实现自动化安装系统
1.安装软件包 # yum -y install epel-release #安装EPEL源 # yum -y install cobbler dhcp pykickstart 2.启动cob ...
- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
FreeMarker template error:The following has evaluated to null or missing:==> product [in templat ...
- Django 学习之中间件Middleware
一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...
- 五、Centos7安装mysql:第一步查看系统有无mysql,然后删除之
CentOS下MySQL的彻底卸载 原创 2015年10月12日 00:16:02 标签: 21149 编辑 删除 #################CentOS7下MySQL的卸载######### ...
- Servlet(1):request和response对象
1.Servlet的生命周期 /** * Servlet的生命周期: * 1.从第一次调用到服务器关闭. * 2.如果Servlet在web.xml中配置了load-on-startup,生命周期为从 ...
- hdu 1599 find the mincost route floyd求无向图最小环
find the mincost route Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 随机序列[SHOI2016](找规律+线段树)
传送门 这道题的题意就是给你n个数让你在每个数之间插入+.-.*三种运算符中的一种,然后算出一个答案,再把答案加起来. 这题肯定是不能暴力的(题目都告诉你了由3n-1种结果).我们先从小的情况枚举找一 ...
- scrollBy 与 scrollTop的区别
scrollTo是相对于初始位置 scrollBy是相对于上次移动的最后位置
- Android简单计时器(转)
原文:http://blog.csdn.net/fwwdn/article/details/7550822 本文利用ContextMenu(上下文菜单),Chronometer实现简单计数器. Mai ...
- keil 生成bin文件
在 User 配置页面中,提供了三种类型的用户指令输入框,在不同组的框输入指令,可控制指令的执行时间,分别是编译前(Before Compile c/c++ file).构建前(Before Bui ...