大概四、五年前,看过陈皓的酷壳上面的一篇文章,上面有一句话我一直记得,是关于学习技术的心得和态度的。

要了解技术就一定需要了解整个计算机的技术历史发展和进化路线。因为,你要朝着球运动的轨迹去,而不是朝着球的位置去,要知道球的运动轨迹,你就需要知道它历史上是怎么跑的。

我觉得对于漏洞利用技术来说也是这样,现有的技术由于历史积攒的原因变的复杂和难以理解,但是如果能追根溯源从源头入手就能够看到由最简单的形态逐步变繁杂的过程。也就可以在追随技术的发展轨迹的过程中理解技术的本质了。

Windows下漏洞缓解措施的主线就是 无-->DEP-->ASLR 这么一个过程,其实主要的攻防技术变化都是围绕着这个主线展开的。

1.蛮荒时期

在Windows XP SP2之前是不存在任何的漏洞缓解措施的,自然而然攻击者的目光放在了在栈上执行代码这一条路上。这一时期的shellcode也是放到栈上的,攻击者考虑的问题主要是栈的地址是不定的,由此产生了跳板技术。使用类似于jmp esp之类的跳板指令实现在栈上执行代码。

  • 主要问题:栈地址不固定
  • 解决方法:使用跳板语句

此外,攻击者发现有时候因为栈中的局部变量覆盖会触发异常,而处理异常的SEH结构就储存在栈中,通过溢出就可以覆盖掉。

  • 主要问题:溢出会触发异常
  • 解决方法:覆盖SEH结构

对于C++对象的漏洞来说的话,通过溢出相邻对象的虚表就可以伪造虚函数指针从而实现任意代码执行。可是堆的地址也不是你想分配到哪就能分配到哪的,换句话说就是不可控的。为了使这个地址可被预知,诞生了堆喷射技术。其实堆喷射在本质上和栈跳板解决的是同一个问题

  • 主要问题:堆的分配地址不固定
  • 解决办法:堆喷到固定地址

2.2004年8月DEP出现

DEP数据执行保护在2004于xp sp2上首次出现,断绝了在栈及堆上执行代码的可能。DEP是一种进程单位的保护措施,一旦一个进程启用,那么就不存在可执行的模块。作为一种漏洞缓解措施DEP的威力是巨大的,从根本上改变了漏洞利用的思路。为了能够执行代码一种思想引用自Linux下的ret2libc的技术诞生了,即使用程序中的代码来分配一个可执行的内存或是执行一些功能。就目前为止(只有DEP保护),所有的dll上的gadgets地址都是不变的。如果是为了在不同系统版本间通用,那么就避免使用系统的dll中的指令,全部使用程序的dll和模块中的指令。通过执行gadgets构成的指令链实现能够在内存执行代码的目的,比如分配一块可读可写可执行的内存,然后复制shellcode进去并执行,或者直接把shellcode所处的内存设为可以执行的,这些操作都可以通过简单的调用两三个api来实现。

  • 主要问题:栈内存不可执行
  • 解决方法:通过构造ROP构造出可以执行的内存块

这时利用SEH的思路是不受影响的,但是首先你得能覆盖的到。

对于C++漏洞来说,在04年之前使用的在堆上伪造虚表的方法就行不通了。因为堆是不可以执行的,在这种情况下,诞生了结合ROP与构造伪虚表结合的思路。总的来说,这种思路是在ROP需要控制栈而堆溢出根本碰不到栈的情况下诞生的,通过把伪造的虚函数地址指定为xchg eax esp的地址,导致把esp(栈)转换到指定的内存空间上(由于触发这种类型的漏洞时,eax必定可控),在堆上布置rop链。而指定的内存空间可以由堆喷来实现目的。

  • 主要问题:堆内存不可执行导致构造的伪虚函数得不到执行
  • 解决方法:通过替换栈到堆上,并通过堆喷到指定的地址,在堆中布置好rop地址。

3.2007年1月ASLR出现

2007年Windows Vista系统引入对ASLR特性的支持,ASLR地址空间随机化会导致系统每次重新启动后所有模块加载的基地址都不相同。同时也会对堆栈的分配起始地址进行随机化,并且TEB和PEB也不存在固定的地址了。但是ASLR是一种以模块为单位的缓解措施,如果有一个进程中有某一个模块不支持ASLR,那么这个模块的加载基地址就不会发生变化。

  • 主要问题:模块地址随机化,导致ROP指令的地址无法确定
  • 解决方法:找到没有开启ASLR的模块,使用其中的指令作为ROP

对于C++类漏洞来说,基本的利用方法保持不变,但是要配合使用一个可以泄漏地址的漏洞进行组合利用才能最终达成目的。比如在IE浏览器中就存在这样的利用方式,通过泄漏对象的虚表地址来计算出模块地址从而绕过ASLR,可以计算出ROP指令的地址实现利用。

  • 主要问题:要构造ROP的指令地址受到ASLR的影响不能确定
  • 解决方法:通过一个可以泄漏地址的漏洞组合利用,实现bypass ASLR

个人理解的Windows漏洞利用技术发展史的更多相关文章

  1. Windows漏洞利用技术概述

    Windows漏洞利用技术总结 1. 前言 本文是我对漏洞利用技术的学习总结,也是自己践行QAD (Questions.Answer.Discussions)的一次实践.本文通过阅读几位大牛的文章.演 ...

  2. Linux环境下常见漏洞利用技术(培训ppt+实例+exp)

    记得以前在drops写过一篇文章叫 linux常见漏洞利用技术实践 ,现在还可以找得到(https://woo.49.gs/static/drops/binary-6521.html), 不过当时开始 ...

  3. Windows漏洞利用 ms17-010

    漏洞名称 SMB 远程命令执行漏洞(ms17-010) 漏洞描述 继2016年 8 月份黑客组织 Shadow Brokers 放出第一批 NSA “方程式小组”内部黑客工具后,2017 年 4 月 ...

  4. Windows 漏洞利用开发

    第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...

  5. Windows漏洞利用与防护(2015.8)

    Windows平台下的漏洞利用与防护 0x00 概述 在过去的二十几年,Windows作为网络安全的主战场之一,攻于防的较量从未停息过.内存破坏漏洞作为研究的重点之一,经历了很多的发展也沉淀了前辈们许 ...

  6. Android内核漏洞利用技术实战:环境搭建&栈溢出实战

    前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...

  7. Linux下的堆伪造漏洞利用技术(new unlink)

    感觉markdown的文件格式看起来更清晰一些就写成附加的形式了.Download 更正:这种利用方式不叫House of Mind,是我搞混了.

  8. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御

    摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...

  9. Linux堆溢出漏洞利用之unlink

    Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...

随机推荐

  1. (四)关于读文件的结束的判别方法(EOF和feof)以及区别

    关于读文件的时候判断文本是否读完的方式一般可以通过EOF,一般宏定义为-1.因为ASCII码中不可能出现-1. 当以文本形式读取文件内容, 读入的字符值等于EOF时, 表示读入的已不是正常的字符而是文 ...

  2. win7,Ubuntu 12.04 双系统修改启动项顺序三方法

    修改启动项顺序的三种方法 本文所涉及的方法都是在Ubuntu的安装时将引导加载程序grub安装在了整个硬盘(即MBR内),即开机以grub引导. 方法1在Ubuntu终端下输入:sudo mv /et ...

  3. 【Asp.net入门11】第一个ASP.NET 应用程序-创建摘要视图

    目前已经完成了应用程序的基本结构单元,受邀者也能够做出回复.这一节将添加一个支持组件,以显示收到的回复摘要,以便用户的朋友了解谁会参加晚会,并做出适当安排.在Solution Explorer中右键单 ...

  4. Python面向对象补充以及异常处理

    面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...

  5. 朝韩危机-Python模拟导弹互射

    萨德系统是麻省理工学院的林肯实验室牵头开发的.林肯实验室可以说是美军方手中的一张王牌.二个反导系统(末段高空区域导弹防御(THAAD)系统,和 国家导弹防御系统(NMD))均由实验室牵头.它既是技术支 ...

  6. javascript精雕细琢(四):认亲大戏——通过console.log彻底搞清this

    目录 引言 代码在前 1.function下的this 2.箭头函数下的this 结语 引言        JS中的this指向一直是个老生常谈,但是新手又容易晕的地方.我在网上浏览了很多帖子,但是发 ...

  7. [Baltic2009]Radio Transmission

    bzoj 1355: [Baltic2009]Radio Transmission http://www.lydsy.com/JudgeOnline/problem.php?id=1355 Time ...

  8. Java中的容器类(List,Set,Map,Queue)

    Java中的容器类(List,Set,Map,Queue) 一.基本概念 Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都 ...

  9. [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)

    [NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...

  10. mysql zip 解压安装

    系统:win10 专业版 mysql 5.7.21 解压安装. 对于Windows,mysql官网推荐使用可执行文件进行安装,这里我还是暂时用noinstall 解压zip文件来安装 zip 文件解压 ...