大多是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的更多相关文章

  1. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  2. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  5. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  6. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  7. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  8. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. Openstack----学习笔记

    ceph 分布式存储,用于存放新创建的云主机磁盘镜像文件和磁盘 创建云主机流程记录 简易版本: 上图中所有发送的请求都会存放在rabbit_mq(消息队列)中,各个组件会定时取消息队列中与自己相关的请 ...

  2. git rebase 与git merge 小结

    git merge是用来合并两个分支的. $ git merge b   将b分支合并到当前分支 同样  $ git rebase b ,也是把 b分支合并到当前分支 ---------------- ...

  3. get方法和load方法的区别

    get方法的特点    get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询    get方法查询后返回的是真实对象的本身   load方法的特点    load方法采用的是延 ...

  4. Azure DNS-

    先看什么是DNS,通常来讲,DNS是将域名解析成IP的服务,例如www.azure.cn对应的IP地址是139.217.8.104 使用域名访问有如下好处: 1. 好记,使用特定的字母组合,代替ip地 ...

  5. VBS 脚本对象

    Dictionary对象(1) 1.        属性: a)        compareMode b)       count c)        key d)       item 2.    ...

  6. python读取文件用b模式读取

    f = open('aaa','rb')    返回的是字节 字符串编码 python中所有的字符串编码为Unicode,如果从一个文件读取字符串,那么该字符串的编码就是该文件的编码. f.tell( ...

  7. SVM数学原理推导

    //2019.08.17 #支撑向量机SVM(Support Vector Machine)1.支撑向量机SVM是一种非常重要和广泛的机器学习算法,它的算法出发点是尽可能找到最优的决策边界,使得模型的 ...

  8. CSS3实现放大缩小动画

    HTML <div> <div style="height: 35px;width:300px;background:orangered;border-radius: 4p ...

  9. java学习-循环结构-查找算法-顺序查找

    今天回顾了简单算法,顺序查找.发现了数组出现重复数字,无法输出第二个位置就跳出循环了. 利用所学知识解决了.放上代码,同时在代码里给大家分享思路. 欢迎大神教导,欢迎指正. ; System.out. ...

  10. 记录下spingboot连接阿里云服务器上的MySQL数据库报错

    错误大概如下: create connection SQLException, url: jdbc:mysql://'IP地址':3306/code007?useUnicode=true&ch ...