HeapSpray初窥(2014.12)
注:环境是xp+ie8
1.HeapSpray简介
Windows的堆因为动态分配和释放的特点,其看起来是不连续(没有规律的),但是仍可以找到一定的规律:大量的连续分配会更倾向使用连续的地址,减少了碎片化。这为利用找到了机会。
HeapSpray就是在内存中分配大量的空间,申请的这些内存都是由相同的NOPs+shellcode所构成。如果存在任意地址写的漏洞,就可以利用该HeapSpray:改变程序的流程,使EIP指向事先分配好的NOPs+shellcode的内存块。这样shellcode就可以得到执行了。
HeapSpray利用的步骤大概如下:
1.Spray the heap
2.Trigger the bug/vulnerability
3.control EIP and make EIP point directly into the heap
当然还要绕过一些安全机制如DEP,这和缓冲区溢出的绕过思路感觉一样。
2.BSTR string object结构
Windows在存储javascript字符串采用的是BSTR string,其结构包含一个用来描述string所占字节数的头+用Unicode编码的string+两字节的NUL:

并且字符串的string.length和bytes存在这样的换算关系:
bytes=length*2+6;
length=(bytes-6)/2;
如下面这句javascript代码,其在内存创建了一段字符串" FuzzySecurity"。其中unescape的功能是不让javascript再对FuzzySecurity的ascci码进行编码。

创建的字符串在内存中:

按照上面的换算公式:
bytes=7*2+6=20
length=(20-6)/2=7
值得注意的是,此时BSTR string head=0xe,而Shellcode.length=7=head/2。这是因为javascript是按Unicode编码来计算字符串的长度的,所以个数减半,javascript在操作字符串的时候也是按照Unicode编码来的,这点在后面布置Shellcode时有用。
3.一个例子
以CVE-2013-0025这个IE上的UAF漏洞为例子,编写exp,使用HeapSpray,并绕过DEP,最后弹出对话框。
3.1分析崩溃
POC如下:

运行这个POC后(不开启ust和hpa),相关的崩溃信息:

可见,若能控制ecx指向内存的值(mov eax,dword ptr[ecx]),也就控制了EIP的值了(call edx)。
3.2占位 (好像是这样叫的吧。。。)
这一步的目的是为了控制EIP。
html如下:

相比上面的POC,只是增加了红框中的一小段javascript代码。具体为什么要这样,暂时还不知道。
然后再次崩溃:

可以看到此时eax的值已经被改变了,从0变成0x0c0c0c0c,这样执行call edx的时候就变成了:call [0x0c0c0c7c]。EIP改变成功,下一步就是布置shellcode到新EIP位置了。
3.3布置Block
先把框架弄好,再来填具体的东西。
所分配的Block内存布局的期望是这个样子的:

看起来有点奇怪:为何不直接将EIP指向shellcode开始的地方?这是有道理的,因为需要过DEP保护,需要先执行一点东西再去执行真正的shellcode(弹出对话框)。
接下来就来实现这个期望吧。
首先需要确定的是padding的大小,在windbg中利用!heap命令,可以找到0x0c0c0c0c所在堆的起始地址:

计算偏移:0x0c0c0c0c-0x0c080018=0x40bf4
0x40bf4对0x1000进行求余运算,得到0xbf4。(0x1000为我们分配的每一个Block的大小)。
这样得到的是所在的字节数,javascript代码所操作的是字符串的长度,这里需要按照上面提到的公式转换一下:
0xbf4/2-6=0x5f4
接下来的shellcode就先随便填一下,只是在+0x70的位置填上一个不一样的值,来确定是否在0x0c0c0c7c的位置能够写上值,为了方便查找还是填上" FuzzySecurity"。
最后这0x1000 大小的Block剩下空间就全部给NOPs了。
这三部分对应的javascript代码分别如下:




要经过大量的堆分配,似乎才可以保证堆"连续",并且保证0x0c0c0c0c是"属于"我们的。所以接下来会分配150MB的堆,这些堆又会分成很多1MB的chunk,每个chunk都是具有很多个上面所构造的这种0x1000大小的Block。对应代码:

结果就像下面这样:

3.4编写shellcode
a.绕过DEP
所使用的方法是构造ROP链来调用VirtualProtect()改写目标地址的读写权限。使用的是下面这段利用msvcr71.dll来构造的ROP链:

引用地址https://www.corelan.be/index.php/security/corelan-ropdb/#msvcr71dll_8211_v71030524
b.执行真正的shellcode吧
现在已经可以执行shellcode这段空间的代码了,那么再跳回到0x0c0c0c7c下一个地址去执行弹出对话框的代码就好了,至于弹出对话框的代码,用metersploit生成一份就好了。
所以完整的如下:

代码会按照红à黄à绿à蓝执行。
最后就弹出对话框了~~
HeapSpray初窥(2014.12)的更多相关文章
- 初窥Kaggle竞赛
初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...
- Java发送邮件初窥
一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...
- 初窥Flask
初窥Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求 ...
- IPFS初窥
虽然区块链有很多令人兴奋的特性,但是也有其固有的缺点.比如,文件或者长度较长的文本信息就不适合存储在链上.那么如何解决这个缺点呢?一个解决方案就是IPFS(Interplanetary File Sy ...
- 程序员Linux教程初窥入门-刘志敏-专题视频课程
程序员Linux教程初窥入门-313人已学习 课程介绍 程序员Linux教程初窥入门主要针对初级入门程序员的课程,也是为后期学习其他课程的一个基础,Git.Maven.Jenkins.R ...
- Scrapy001-框架初窥
Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- scrapy2_初窥Scrapy
递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...
- WWDC15 Session笔记 - Xcode 7 UI 测试初窥
https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...
随机推荐
- linux挂载新硬盘
Linux添加新硬盘自动挂载硬盘的具体步骤 1.插入新硬盘,启动Linux服务器,使用fdisk -l 查看硬盘 #fdisk -l Disk /dev/sdb: 1000.2 GB, 1000204 ...
- ios 3D Touch功能的实现
ios9中3D Touch功能是一个新的亮点,这个方便快捷的功能实现也比较简单,废话不多说直接上代码, 一.3D Touch功能添加分为两种(1).静态标签 (2).动态标签 (1).静态添加 这个方 ...
- 重载operator<<
学习<深入探索>时,发现原文中提供的一个代码大致如下(书中第3页) class Point3d { inline ostream& operator <<(ostrea ...
- HTTP状态码(HTTPStatusCode)
HTTP状态码(HTTPStatusCode) 祓焘铺 布稍酡 盛坭馆 距熏屿砥 女装出来扔了套到床上然后自己穿了套 跎徨鼻卩 权术埭 悌颞 蔹咽诹ㄒ 椿酣漂作 钱是小事关键是没有老师耸了 ...
- Eclipse 打开当前文件所在的文件夹
两种方法: 1.安装EasyExplorer插件,有了这个插件就可以很方便地打开资源文件所在的文件夹了. EasyExplorer 从 http://sourceforge.net/projects/ ...
- 解决ubuntu 里面vi的时候上下左右是ABCD删除也不起作用
解决ubuntu 里面vi的时候上下左右是ABCD,backspace也不起作用 cp /etc/vim/vimrc ~/.vimrc 用remove vim-common然后再install v ...
- mysql B+树 Cardinality MRR
B+树索引并不能找到一个给定键值的具体行,而是被查找数据行所在的页.然后数据库通过把页读入到内存,再在内存中进行查找,最后得到想要查找的数据. Show index from table. Cardi ...
- BuildingAndRunningUAFServerUsingMaven
https://github.com/eBay/UAF/wiki/BuildingAndRunningUAFServerUsingMaven(CLIonly) 实现uaf的demo,使用ebay的方案 ...
- 写Java程序的三十个基本规则【新手必读】
(1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName this ...
- 《JavaScript高级程序设计》读书笔记 ---小结
对象在JavaScript 中被称为引用类型的值,而且有一些内置的引用类型可以用来创建特定的对象,现简要总结如下: 引用类型与传统面向对象程序设计中的类相似,但实现不同: Object 是一个基础 ...