HackTem爆出的第二枚0day,分析了下,做个记录。

Poc中一开始会分配一个Array类型的_ar结构。

第一次赋值

此时在a[0 ] –a[1e-1] 处已被赋值为Vector.<uint>(62)结构。

任意查询可发现给vector的长度已被赋值为62生成的array  0~1e

之后对1e~7e间的ar[i]进行赋值,每个模块为Vector.<uint>(8),其中第一个字节设置标记位,用于之后快速定位越界单元。

查看对应的内存,可以发现1e~7e中为长度为8的Vector.<uint>(8)

a[i]中被赋值之后的数组1e~2e处已被赋值

总的a[i]内存

对a[i]中1e~2e处的单元进行赋值,赋值对象为一个TextLine对象

开始赋值

赋值结束之后的内存空间

此时a[i]中赋值完毕,整体的a结构

获取对应的textline的对象

对a[i]中1e~2e中的textline单元设置opaqueBackground属性,该属性会导致avm为每个单元分配大小为0x390的内存空间

获取对应的textline对象

首先调用0418e3b3处的函数用于返回对应的textline单元,获取该单元之后在0418e3fecc处通过call eax 创建0x390大小的内存,在该函数中随后会有对valueOf2的操作进行判断,成功的话会由此进入valueOf2的判断,从而导致uaf,而在call eax返回前会对0x390的内存空间偏移0x320的地方进行6a的赋值,通过精心的内存布局,可致使6a被写入到vector的length域中。

整个内存分配结束之后

生成的vector<uint>(62)

生成的Vector<8>

生成的backGroundObj空间

对textline对象的opaqueBackgroind属性进行赋值,此处赋值的对象为MyClass32,由于array为Byte属性,此时赋值的话将导致MyClass类的valudfo函数调用。

进入valueOf函数中,对a[i]中的textline对象进行释放,大小

释放前的backgroudObj

完全释放5个backgroudObj之后。

释放之后立即,对a[i]中1e~7e的数据单元的长度进行重置,由于avm中的内存管理机制,会导致之前分配的内存被优先分配,从而致使之前释放掉的5个backgroudObj的内存被重新分配的ar数组中的十个单元所占有。

如下图所示内存出处最后一个单元外,之前所有的单元已经重新分配完毕

通过对比释放掉的五个backgroundObj,此处可以在内存中搜索出是那几个单元重用了之前释放的内存,如下图所示。

之前提到该操作会导致对应MyClass类的ValueOf函数被调用,在该函数中我们释放5个backgroundObj对象,同时使用通过重置ar[i]中1e~7e单元的大小,重新占有了这5个backgroundObj对象之前的空间,ValueOf函数返回后,在其后的对应操作中,会对之前的5个backgroundObj对象中x320的位置进行想x190的赋值操作,由于重置之后的ar[i]单元大小为x190,因此正好导致其中某处单元的vector的长度值从62被设置为6a。

整个过程如下图

被设置的ar[3b]单元,可见此处的length域已经被赋值为6a。

获取越界的a[i],并将其相邻的vector结构的长度设置成40000000,因而获取一个超长的全内存读写vector

生成的全局内存读写vector

最新文章

  1. MySql免安装版安装配置,附MySQL服务无法启动解决方案
  2. GTD
  3. javascrit2.0完全参考手册(第二版) 第1章第1节 在XHTML文档中增加javascript
  4. 简单破解.net(C#)程序
  5. 修改datagridview中其中一列的值
  6. 斌哥的 Docker 进阶指南—监控方案的实现
  7. Hibernate逍遥游记-第5章映射一对多-01单向&lt;many-to-one&gt;、cascade=&quot;save-update&quot;、lazy、TransientObjectException
  8. javascript 比较对象(hashcode)
  9. sqlite 学习
  10. JSON数据写入和解析
  11. jd-gui在Ubuntu上打不开
  12. selenium配置Chrome驱动
  13. Linux 抽象网络设备简介
  14. Linux——文件搜索命令简单笔记
  15. pandas 对dataframe一列中某些值进行处理
  16. curl之采集QQ空间留言
  17. fiddler 手机装证书
  18. 数据库 proc编程九
  19. [问题解决]gradle编译失败系统找不到指定的文件
  20. C# 操作FTP

热门文章

  1. Android Studio使用
  2. Java编程思想重点笔记(Java开发必看)
  3. 直接操作 SDL_Overlay YUV叠加上的像素
  4. no module named flask.ext.login
  5. mui jquery 同时使用
  6. QT C1041错误
  7. PHP系统声明式事务处理
  8. hdu4790 Just Random (数学?)
  9. krpano
  10. toolkit --------chart属性