V8 Exploit Level2

zhaojunqi Lv2

V8 Exploit Level2

level2:

一.分析patch文件

给出addressof原语和沙箱(sandbox)中的Arbitrary Read & Write
sandbox是v8引擎的一种内存保护机制,沙箱背后的基本思想是隔离 V8 的(堆)内存,使内存损坏无法“扩散”到进程内存的其他部分。所以进程只能访问沙箱内部的内存区域,而无法访问沙箱外面的内存区域。
addressof原语(给定一个对象,可以返回该对象所在的内存地址)
Arbitrary Read & Write原语(可以实现沙箱内部的任意地址读写)

二.利用思路

将shellcode以浮点数的形式输出出来再写入自定义的shellcode函数当中,通过触发MAGLEV compilation编译器会将生成的code写入RWX segment中,通过修改指向RWX段中该code的指针,将指针指向自定义的浮点数形式的execve("catflag", NULL, NULL)当中,即可在再次执行shellcode()时执行execve("catflag", NULL, NULL)

三.调试方法

gdbinit_v8脚本

使用GDB进行调试,V8团队还写了个GDB的辅助调试脚本gdbinit_v8,可以从这里下载,并在.gdbinit中加载。

脚本指令

找到想要调试的JS脚本,通过在脚本中事先添加两种代码来辅助之后的调试过程:

%DebugPrint(arg1)——该方法会打印目标对象的内存地址并对其主要信息进行输出。
%SystemBreak()——该方法可以在脚本中下断点。

GDB指令

使用GDB对编译出来的d8文件进行调试,并设定参数--allow-natives-syntax来允许使用本地码(%SystemBreak()等)。
然后使用r命令运行后,脚本就会暂停在%SystemBreak()处,并且已经执行的%DebugPrint()方法会输出指定对象的信息。

使用gdbinit_v8中的job指令可以对指定内存地址上的对象进行信息输出。

四.exp

for (let i = 0; i < 100000; i++) shellcode(); 将shellcode()执行100000次,触发MAGLEV编译,编译器会将生成的code写入RWX段中(在沙箱外,但指向code的指针在沙箱内部,因此可以访问)
此时可通过%DebugPrint(shellcode); %SystemBreak(); 来观察shellcode函数所在内存地址的详细信息

调试步骤

1.在exp中加入%DebugPrint(shellcode); %SystemBreak();语句
2.sudo gdb /challenge/d8
3.run --allow-natives-syntax /home/hacker/exp.js
此时会有输出如下图所示:

此时观察到shellcode函数的地址为0x1b98001d3acd,code的地址为0x1b9800240241,但此时请注意,由于v8引擎的函数地址会默认8字节对齐,所以后三位默认是全0,因此对区别不同函数没有帮助,可用来作为标记使用(标记是函数还是smi,1为函数,0为smi),因此0x1b98001d3acd是末位加一之后的结果,因此实际地址为0x1b98001d3acc
x/20gx 这一GDB命令为查看某地址开始的20个双字的值

观察到240241在0x1b98001d3acc的偏移量为0xc的位置。因此code字段所指地址(其实是指向RWX段元数据的指针)为shellcode_addr + 0xC,其中shellcode_addr是通过addressof原语得出的

此后利用job指令,查看0x1b9800240241

同理可得,指向通过MAGLEV编译生成的code的指针的地址为code_addr+0x14

再根据偏移量可得出真正的shellcode距离code首地址的偏移为0x6B(因为shellcode的十六进制的开头为4831d24831f6eb0c,正好为偏移0x69+0x2=0x6B)因此找到了shellcode在内存当中的地址,将该值放入指向code的指针的地址的位置,因此再执行一变shellcode()即为执行execve(“catflag”, NULL, NULL)

结语

level2中利用了任意地址读写原语和addressof原语完成了任意代码执行,核心是学习如何通过d8进行调试,一步一步得出偏移量,最终实现任意代码执行。这小结可能讲的有点绕,但本质就是根据经验一步一步调偏移,如果有问题欢迎多多交流。

  • Title: V8 Exploit Level2
  • Author: zhaojunqi
  • Created at : 2024-12-10 20:32:28
  • Updated at : 2025-10-17 17:31:06
  • Link: https://redefine.ohevan.com/2024/12/10/V8-Exploit-Level2/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments