评价

  1. 首先评价一下这本书吧:(先抑后扬吧) 
    有些漏洞是win2000的,实在是太老了,难以进行实践,但是介绍一下也是很好的,但是不能实践理解得不深刻。【第一版是08年出版的,第二版是2011年,我手上的是第二版,这2014年,xp都停止服务啦(xp用着还是挺爽的哦)】
  2. 从基础的漏洞利用原理,到漏洞挖掘的技术(其实基本都是举例子),到内核,最后接近10个分析案例,相对来说还是比较全面的了,在基础知识方面,讲得挺好的,图文并茂

软件安全的漏洞类型

  • 栈溢出漏洞
  • 堆溢出漏洞
  • 释放后重用
  • 双重释放
  • 整数溢出漏洞
  • 字符串格式化漏洞
  • 拒绝服务漏洞
  • 竞争条件漏洞
  • 资源未释放漏洞
  • 数组越界访问
  • 类型混淆
  • ……

​​其实0day2里面主要讲的是栈溢出和堆溢出,提了一下字符串格式化漏洞,其他的基本没有吧 
栈溢出应该是最为简单的一个漏洞类型,相对容易理解

​​

还有就是里面有一篇有关内核漏洞,也看看分类吧

按照漏洞的严重程度分类 
- 远程拒绝服务漏洞 
- 本地拒绝服务漏洞 
- 远程任意代码执行漏洞 
- 本地权限提升漏洞

​​我感觉本地拒绝服务是严重程度是最低的,之后才是远程拒绝服务

按照漏洞的利用原理分类 
- 拒绝服务漏洞 
- 缓冲区溢出漏洞 
- 内存篡改漏洞 
- - 任意地址写任意数据 
- - 固定地址写任意数据 
- - 任意地址写固定数据 
- 设计缺陷

​既然说到内核,看看书里面内核漏洞利用的思路: 
一种是篡改内核内存数据 
另外一种是执行Ring0 Shellcode(推荐的是这种) 
因为我们需要用Ring0 Shellcode将CR0的WP标志位置0了,进而禁用了内存保护,我们才能够篡改内核内存数据

windows提权怎么实现的?

其实windows系统的提权就是将当前进程EPROCESS的token值覆盖为system的token值,这样就完成了提权,shellcode的作用便是如此

Windows的安全机制

面对形形色的内存攻击,微软加入了什么样的安全机制呢

  • GS编译,就是Security Cookie
  • SafeSEH(Safe Structured Exception Handling)安全的结构化异常处理(增加了安全的校验机制)
  • DEP(Data Execution Prevention)数据执行保护
  • ASLR(Address Space Layout Randomization)地址空间布局随机化
  • SEHOP(Structured Exception Handling Overwrite Protection )SEH覆盖保护

栈溢出漏洞的利用

  1. 最经典的就是覆盖返回地址
  2. 覆盖SEH结构
  3. 覆盖虚表指针
  4. 堆喷射(Heap Spray)
  5. offset by one(就是部分覆盖)

​​还有的话就是特定的常见会有特定的思路 
或许你修改了栈上的一个变量的地址,或许会改变程序执行流程什么的,获取它是一个函数指针呢

堆溢出漏洞的利用

  1. DWORD SHOOT 
    其实就是利用这个下一个空闲的堆块从链表卸下时会有一次写的机会 
    因为前向指针和后向指针都被我们覆盖了

公式如下: 
node->blink->flink = node->flink 
node->flink->blink = node->blink

​​假如flink被覆盖shellcode地址,blink被覆盖为SEH的处理程序的地址 
那么 
SEH的处理程序的地址 = shellcode的地址 
shellcode地址+4的位置 = SEH的处理程序的地址

​​其实这样可能会影响shellcode的,因为shellcode的第4-8个字节被改了,当然我们前面的字节一般是nop,如果改了之后不影响shellcode的执行才行

​​这DWORD的任意地址写任意地址写任意数据还可以写哪里呢 
可能可以覆盖接下来要调用的虚函数表中的某个虚函数呢

​​当然如果linux直接就覆盖got表了

绕过Windows的安全机制

GS

​​因为GS为每个函数的调用增加了一些额外的数据和操作,这会影响性能,所以并不是每个函数都会应用GS,不会应用GS的情况如下: 
- 不包含缓冲区的函数 
- 函数被定义为具有变量参数列表的 
- 使用无保护的关键字标记的(但是这个关键字是什么呢) 
- 函数的第一个语句中包含内嵌汇编代码的 
- 缓冲区不是8字节类型且大小不大于4字节

1.利用未被保护的内存突破GS

​​就是你的攻击点是攻击没被保护的函数,假如他们有漏洞就好,没漏洞能不能将漏洞转移到这呢,这是一个问题

2.覆盖虚函数突破GS

​​假如我们攻击的函数在复制之后,有这个虚函数的调用,那么假如覆盖了栈上的虚表数指针,就可以在gs检测之前劫持程序(0day里面是使用部分覆盖,由于作者使用的是静态字符,跟虚表都在.rdata段,但利用起来还是会出些问题)

3.攻击异常处理突破GS

​​当然这也是在复制覆盖SEH后,函数还调用了某些因为覆盖了某些变量导致触发异常处理的操作

4.同时替换栈中和.data段中Cookie突破GS

​​这个其实很难做到吧(就算有任意地址写,你要知道他在data段的,之后你还要有机会利用溢出),0day里面其实都是写死了,提前将buf跟data段Cookie的距离都给计算出了

SafeSEH

在书中的那个图中,我们怎么可以通过SafeSEH的安全验证呢? 
- 异常处理函数位于加载模块的内存范围之外,DEP关闭 
- 异常处理函数位于加载模块的内存范围之内,相应模块未启用SEH(安全SEH表为空),同时还要不是纯IL(IL是.NET框架中中间语言(Intermediate Language)的缩写),根据图的话DEP也是要关掉 
- 内存范围之内但启用了SafeSEH(安全SEH表不为空),异常处理函数包含在安全SEH表中

其实有时候作者说的某些方法并不算绕过,拿SafeSEH来说,其实是不攻击SEH 
比如: 
攻击返回地址绕过SafeSEH 
攻击虚函数绕过SafeSEH

​​

我们看看实际一点的: 
1. 从堆中绕过SafeSEH:利用的是SafeSEH对堆的特殊处理,作者说看成是普通的SafeSEH(当然DEP要关闭咯) 
2. 利用未启用SafeSEH模块绕过SafeSEH(可以用OllySSEH插件查看) 
3. 利用加载模块之外的地址绕过SafeSEH(类型为Map的映射文件,SafeSEH是无视他们的,加入在里面找到跳板就很好了) 
4. 利用Adobe Flash Player ActiveX控件绕过SafeSEH(Adobe Flash Player 9.2.124之前的版本不支持SafeSEH),当然如果有其他的没有启用的ActiveX插件也是可以的哦

DEP

  1. 攻击未启用DEP的程序(这个也算不上绕过…)
  2. 利用Ret2Libc挑战DEP 
    • 比如通过传递特定的参数给ZwSetInformationProcess关闭DEP【第一个参数为进程的句柄,设置为−1 的时候表示为当前进程,第二个参数为信息类 —– 0x22,第三个参数可以用来设置_KEXECUTE_OPTIONS —- 0x2,第四个参数为第三个参数的长度 — 0x4】,之后就随便搞咯,但其实系统里面本来就存在关闭DEP的代码,不用我们构造参数,^_^
    • 返回到VirtualProtect,申请一段可执行的内存
    • BOOL VirtualProtect( 
      LPVOID lpAddress, // region of committed pages 
      SIZE_T dwSize, // size of the region 
      DWORD flNewProtect, // desired access protection 
      PDWORD lpflOldProtect // old protection 
      ); 
  3. 利用可执行内存挑战DEP(假如我们能将shellcode复制到哪个区域,之后将EIP指向哪里就行了)
  4. 利用.NET挑战DEP(需要ActiveX有溢出漏洞,.net控件包含shellcode和触发ActiveX控件溢出漏洞的POC页面)
  5. 利用java applet挑战DEP(跟上面差不多,差别就是java applet含有shellcode)

ASLR

  1. 攻击未启用ASLR的模块
  2. 利用部分覆盖定位内存(因为32位随机化的是前两个字节)
  3. 利用Heap spray技术定位内存地址
  4. 利用Java applet heap spray技术定位内存地址
  5. 为.NET控件禁用ASLR

SEHOP

  1. 利用未启用SEHOP的模块
  2. 伪造SEH链表(FFFFFFFF是最后一项标识符)

堆的保护机制

堆保护方式: 
1. PEB random:dword shoot写内存,覆盖PEB指针,加入随机化了就不行了 
2. Safe Unlink:验证当前堆块的下一个堆块的前向指针和前一个堆块的后向指针是否指向当前堆块 
3. heap cookie:跟栈的GS类似,cookie放在segment table处,占一个字节 
4. 元数据加密:块首一些重要元素与一个4字节的随机数进行异或运算,使用时再异或回来,我们就不能直接破坏或改写这些数据了

绕过 
1. 利用chunk重设大小攻击堆(利用申请新的内存的时候的一次写的机会) 
2. 利用Lookaside表进行堆溢出(Safe Unlink对快表没验证,所以就攻击快表咯)

《0day安全:软件漏洞分析技术》的一点总结相关推荐

  1. 0day安全:软件漏洞分析技术(第2版)

    0day安全:软件漏洞分析技术(第2版) 基本信息 作者:王清   张东辉   周浩   王继刚   赵双 丛书名:安全技术大系 出版社:电子工业出版社 ISBN:9787121133961 上架时间 ...

  2. 0day安全:软件漏洞分析技术——系统内核漏洞

    本文是阅读<0day安全:软件漏洞分析技术>后的笔记.      内核漏洞主要的作用包括:远程任意代码执行,本地权限提升,远程拒绝服务攻击,本地拒绝服务攻击.从漏洞的利用来看,远程拒绝服务 ...

  3. 《0day安全-软件漏洞分析技术》实验笔记2

    实验 3.4 通用shellcode 工具 Windows XP SP3 Visual C++ 6.0 OD IDA 源代码 见随书代码,参考:https://github.com/jas502n/0 ...

  4. 【逆向】《0day安全-软件漏洞分析技术》实验笔记2

    实验 3.4 通用shellcode 工具 Windows XP SP3 Visual C++ 6.0 OD IDA 源代码 见随书代码,参考:https://github.com/jas502n/0 ...

  5. 书评第003篇:《0day安全:软件漏洞分析技术(第2版)》

    本书基本信息 丛书名:安全技术大系 作者:王清(主编),张东辉.周浩.王继刚.赵双(编著) 出版社:电子工业出版社 出版时间:2011-6-1 ISBN:9787121133961 版次:1 页数:7 ...

  6. 《0day安全:软件漏洞分析技术第二版》

    简单说来,这次再版的原因有二: 首先,国人深知与时俱进的道理,技术上面更是如此.随着windows平台保护技术的不断改进,win7的广泛使用,第一版中所述的很多方法已有较大局 限.为此我们逐一搜集了近 ...

  7. 0day安全:软件漏洞分析技术(第2版)pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书分为4篇17章,系统全面地介绍了Windows平台缓冲区溢出漏洞的分析.检测与防护.第一篇为常用工具和基础知识的介绍:第二篇从攻击者的视角出 ...

  8. 《0day安全:软件漏洞分析技术》学习笔记·1(需要补充节部分)

    文章目录 基础知识 漏洞概述 漏洞挖掘 漏洞分析 漏洞利用 漏洞在安全中的应用 二进制文件概述 PE文件格式 虚拟内存 PE文件与虚拟内存之间的映射 基础知识 漏洞概述   通常把这类能够引起软件做一 ...

  9. 软件漏洞分析技术(一)

    目录 1.1 关于漏洞 1.1.1 bug与漏洞 1.1.2 几个经典的安全问题 1.1.3 漏洞挖掘.分析及利用 1.1.4 漏洞的公布与0 day响应 1.2 二进制文件概述 1.2.1 PE文件 ...

最新文章

  1. 第三次作业+105032014085
  2. 5、在secureCRT中vi显色
  3. Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌
  4. Leetcode: Validate Binary Search Tree
  5. 内部时钟和外部时钟隔离的Σ-Δ调制器
  6. 为什么用scrum_为什么Scrum糟糕于数据科学
  7. NoSQL 数据库不应该放弃 Consistency
  8. python print format
  9. 大数据驱动乡村振兴共享共治机制研究
  10. 一次linux root密码错修改历程
  11. 堆排序(java完整代码)
  12. 求任意多边形面积(凹多边形和凸多边形)
  13. linux各个版本简介 (未完待续)
  14. messagebox 确认 取消
  15. SIRIUS更新日志|SIRIUS人脸识别更新日志|天狼星人脸识别更新日志
  16. 空气能热水器的优惠价格在哪里找?
  17. cala中隐式转换(implicit conversion)的优先顺序
  18. 苹果手机怎么编辑word文档_word文档转pdf要怎么实现?word转pdf好方法推荐
  19. 机器学习——一元线性回归和多元线性回归
  20. 首届“攀升玩创嘉年华”端午江城噶事!

热门文章

  1. mybatis if标签比较字符串
  2. Sprinig泛型依赖注入
  3. 《树莓派渗透测试实战》——总结
  4. ha-2:read-project-properties (default) on project
  5. Linux awk内部变量
  6. C# 制作开机自动启动程序
  7. javascript 循环语句 while、do-while、for-in、for用法区别
  8. nodejs web开发入门: Simple-TODO Nodejs 实现版
  9. 年末裁员事件背后的启示录(1)
  10. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)