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

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

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

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. OpenJudge1001Exponentiation

    问题描述 Problems involving the computation of exact values of very large magnitude and precision are co ...

  2. Memcache PHP 使用笔记

    Memcache PHP 使用笔记 最近在做网站迁移 看到之前的一个网站目录下Cache文件里上万的缓存文件真是害怕 新的服务器上配置了memcache扩展 于是乎准备折腾一下看看能不能把之前的文件缓 ...

  3. Python【requests】第三方模块

    import requests print("===============get请求================")url = 'http://api.nnzhp.cn/ap ...

  4. Djang下载虚拟环境设置

    下载安装 教程地址 https://docs.djangoproject.com/en/1.11/howto/windows/ 有一个步骤是创建虚拟环境 创建环境 mkvirtualenv env1 ...

  5. OpenStack 认证服务 KeyStone连接和用户管理(四)

    连接keystone两种方式: 一种使用命令 一种使用环境变量 1.通过环境变量方式连接keystone(适合在初始化场景使用) 配置认证令牌环境变量 export OS_TOKEN=07081849 ...

  6. python net-snmp使用

    安装 官网:http://www.net-snmp.org/download.html 环境:CentOS 6.6 + python 2.7.10 1.下载安装包 net-snmp-5.6.2.1.t ...

  7. webpack 多页面|入口支持和公共组件单独打包--转载

    转载自:http://www.jb51.net/article/117490.htm 本篇主要介绍:如何自动构建入口文件,并生成对应的output:公共js库如何单独打包. 多入口文件,自动扫描入口. ...

  8. Shell记录-Shell命令(其他)

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. .命令格式 top [参数] Shell 2.命令功能 显示当前系统正在执行的 ...

  9. 蓝桥杯 剪邮票 DFS (不错的题目)

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...

  10. SpringBoot 线程池配置 实现AsyncConfigurer接口方法

      目的是:  通过实现AsyncConfigurer自定义线程池,包含异常处理  实现AsyncConfigurer接口对异常线程池更加细粒度的控制 *a) 创建线程自己的线程池  b) 对void ...