V8 Exploit Level3

zhaojunqi Lv2

V8 Exploit Level3

level3:

一.分析patch文件

给出addressof原语和fakeobj原语
addressof原语(给定一个对象,可以返回该对象所在的内存地址)
fakeobj原语(给出一个地址,返回一个以该地址为首地址形式的对象)

二.利用思路

根据addressof原语和fakeobj原语通过伪造对象的方式构造任意地址读写原语,进而通过level 2中的方法实现任意代码执行。

三.exp

核心代码如下图所示(通过伪造对象的方式构造任意地址读写原语)

首先构造一个浮点型数组var arr= [c2f(0x001cb8a5, 0x00000725), c2f(0x00000725, 0x00008000)];
由于v8的数据结构具有特定的存储方式,详见v8数据结构,或者我自己画的简略图
接着通过addressof原语得到arr的首地址,接着通过var fakearr=GetFakeObject(arr_addr+0x54)伪造一个对象对象的首地址为arr_addr+0x54(利用Heap Fengshui,通过level2中的调试方式,将fakearr的首地址置为arr[0]的首地址处,如下图所示)

注:此处fakearr的map值是0x001cb8a5,该为能够正确被编译器识别的map值,所以在填入arr[0]时应当提前创建一个数组对象,将它的map值取出,再填入arr[0]处,即可成功伪造一个对象fakearr。

任意地址读写原语构造

此时将arr[1]处的低32位改为cage_addr(目标地址)-0x8,则再访问fakearr[0]即为访问fakearr的element域所指位置+0x8的位置,因此
访问fakearr[0]即为读出目标地址的内容。因此实现了任意地址读原语的构造
同理,将value写入fakearr[0]即可实现任意地址写原语。

有了任意地址读写原语以及addressof原语,即可用level2中的方法实现任意代码执行。

结语

level3中利用了addressof原语和fakeobj原语利用伪造对象的方式构造出了任意地址读写原语,进而利用level2中的方式,完成了任意代码执行,核心是利用addressof和fakeobj原语构造任意地址读写原语的过程,如果有问题欢迎多多交流。

  • Title: V8 Exploit Level3
  • Author: zhaojunqi
  • Created at : 2024-12-11 13:54:03
  • Updated at : 2025-10-17 17:31:05
  • Link: https://redefine.ohevan.com/2024/12/11/V8-Exploit-Level3/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments