Adobe Flash Player PCRE 越界读写任意代码执行漏洞分析与利用

二进制安全研究 rabit2013 阅读(2693) 0评论

Adobe Flash Player PCRE 越界读写任意代码执行漏洞分析与利用

1、漏洞简介

漏洞编号:CVE-2015-7633(由CloverSec Labs小伙伴发现),由于Adobe Flash Player中使用的PCRE引擎在编译正则表达式时存在一个逻辑错误,可以越界读写内存,通过精心构造最终可导致任意代码执行。

2、影响版本

3、漏洞原理分析

触发漏洞的最简单正则表达式字符串如下:

上述字符串将会被编译为如下字节码:

上述字节码的大体含义为:

find_recurse函数的实现代码:

在执行find_recurse()函数时,code指向上述编译后的字节码,_pcre_OP_lengths的定义如下:

它是一个全局OP_LENGTH集合,集合的总长度为0x6D, 但是程序的执行逻辑为:

在上述字节码中取出的0x80会被当成索引,形成一个越界读漏洞。

4、漏洞利用

在Flash模块中,越界读取导致的_pcre_OP_lengths[0x80]将取出0xff,即code += 0xff,此时code就越过了自身内存块,指向了其他内存数据,find_recurse()返回逻辑如下:

越界读取一个字节c = *code,当c == OP_END时,返回NULL,当c == OP_RECURSE时,返回当前的code指针。因此,需要构造内存使得c == OP_RECURSE,就可以让该函数返回一个已经越界了的指针。如果指针返回后有代码对该指针有数据的写入操作,那我们就有可能获得一次数据写入的机会。通过栈回溯调用关系,找到调用find_recurse()函数的对应代码如下:

find_recurse函数返回越界的ptr指针后,最终会进入PUT(ptr, 1, offset + adjust)往ptr写入一字节数据,于是针对该漏洞利用的思路为:首先通过Vector.对象构造出内存空隙,触发漏洞后修改掉Vector.的length域,紧接着借助Vector.实现任何地址读写,最终可达到任意代码执行。

5、Crash Poc

能导致Adobe Flash Player崩溃的poc样本源代码。

poc.as

6、Exploit Demo

最后提供一段exploit示例代码,测试有效环境:Windows 7 x86 + IE11 + fp_17.0.0.134 ~ 18.0.0.203, 执行成功后程序将会往地址0x44444444写入0x41414141。

exp1.as

转载请注明:CloverSec Labs » Adobe Flash Player PCRE 越界读写任意代码执行漏洞分析与利用

喜欢 (17)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 大牛你好
    kk2016-04-14 21:07 回复