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

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

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

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. laravel 命令行输出进度条

    有时候我们想在命令行执行一些耗时的命令,我们可以利用 symfony 提供的进度条相关的类,来输出一个进度条,显示当前的处理进度. 参考:http://symfony.com/doc/current/ ...

  2. 一个最简单的使用Entity Framework 查询SQL 数据库的例子

    1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Ent ...

  3. Ansible2:主机清单

    目录 Hosts and Groups(主机与组) 简单的主机和组 端口与别名 指定主机范围 使用主机变量 组内变量 组的包含与组内变量 Patterns(主机与组正则匹配部分) 1. 表示所有的主机 ...

  4. tomcat启动时,内存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

     问题原因 通过tomcat启动项目,也许是因为项目太大,配置的内存不够用了.老是报内存溢出的问题. 解决办法 1.选中项目 右键 run as ->Run Configurations... ...

  5. 把一个IEEE754浮点数转换为IBM370浮点数的C#代码

    把一个IEEE754浮点数转换为IBM370浮点数的C#代码. 在这个网页上有古老的IBM370浮点格式的说明. // http://en.wikipedia.org/wiki/IBM_Floatin ...

  6. Docker中执行Shell出现乱码

    问题描述 最近遇到一个问题: 执行命令 docker exec f4af9b sh -c 'bash /tmp/build.sh' 命令在docker中执行shell,会出现中文乱码的问题.但是在do ...

  7. python 12306 车次数据获取

    ssl._create_default_https_context = ssl._create_default_https_context train_data = '2018-10-20' head ...

  8. hadoop启动步骤

    一.ssh的启动 ssh localhost二.hadoop的HDFS的格式化 bin/hadoop namenode -format三.hadoop的start-all.sh的启动 bin/tart ...

  9. phpcm nginx 伪静态文件

    rewrite ^/show-([0-9]+)-([0-9]+)-([0-9]+).html /index.php?m=content&c=index&a=show&catid ...

  10. numpy多项式拟合

    关于解决使用numpy.ployfit进行多项式拟合的时候请注意数据类型,解决问题的思路就是统一把数据变成浮点型,就可以了.这是numpy里面的一个bug,非常low希望后面改善. # coding: ...