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

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

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

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. hdu 6311 欧拉回路

    题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...

  2. BAYES和朴素BAYES

    0 前言  朴素贝叶斯算法仍然是流行的十大挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些 ...

  3. 安装mysql-5.6版本步骤与卸载

    官网下载完解压后: 1.环境变量配置Path   D:\mysql-5.6.40-winx64\bin(你的mySql5.6的路径到bin)2.找到D:\mysql-5.6.40-winx64文件中的 ...

  4. 并发库应用之四 & 线程锁Lock应用

    Java5的线程并发库中,提供了相应的线程锁接口Lock来帮助我们同步处理.Lock比传统线程模型中的synchronized更加面向对象,锁本身也是一个对象,两个线程执行的代码要实现同步互斥效果,就 ...

  5. 六、强大的 Stream API

    一.了解 Stream Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*).Stream 是 Java8 中处 ...

  6. iframe元素的学习(笔记)

    什么是iframe:iframe元素即内联框架,iframe是内联的并且承前启后,对于外围的页面,iframe是一个普通的元素,对于iframe里面的内容,又是一个五脏俱全的页面.重下面的写法可以看出 ...

  7. 可简单避免的三个 JavaScript 发布错误

    Web应用程序开发是倾向于在客户端运行所有用户逻辑和交互代码,让服务器暴露REST或者RPC接口.编译器是针对JS作为一个平台,第二版ECMAScript正是考虑到这一点在设计.客户端框架例如Back ...

  8. TED_Topic6:How to raise a black son in America

    By Clint Smith As kids, we all get advice from parents and teachers that seems strange, even confusi ...

  9. laravel更新某一个或几个字段

    //更新会员状态status $ary_where = array(); $ary_where[] = ['id', '=', $int_id]; $result = $this->obj_ad ...

  10. 【leetcode 简单】 第六十九题 删除链表中的节点

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...