V8 Exploit Level3
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.