怎么征服一台v8?
想驯服一台V8?别慌,它虽然嗓门大、脾气爆,但本质上就是个渴望被理解的“钢铁猛男”。
第一步:投其所好
V8不喝92号“矿泉水”,98号“威士忌”才是它的最爱。机油?必须全合成,黏度要对,不然它分分钟给你摆脸色(比如拉缸)。
第二步:温柔拆解
拆螺丝要像拆盲盒——顺序错了?恭喜,喜提“发动机拼图大礼包”!记住,扭矩扳手是你的最佳僚机,拧太紧它会“哭”(滑丝),拧太松它会“跑”(漏油)。
第三步:灵魂交流
装正时链条时,务必比对待前任的生日还认真。错一个齿?V8秒变“重金属咳嗽老人”。点火前记得深情鼓励:“宝贝,吼一嗓子给我听听!”(然后祈祷邻居别报警)。
终极奥义
如果它终于发出低沉咆哮……恭喜!你已收获一台“机械哈士奇”——费油、爱闹,但让你笑得像个200斤的孩子!
(友情提示:备好钱包,V8的“爱”是按升计算的!)
回归正题
之前跟着其他同学做过其他JS引擎的fuzz,比如说webkit(Safari),对这些浏览器的漏洞也有一些了解。
环境配置:
(如果没有身处天朝应该会非常顺利)
depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH":pwd/depot_tools
ninja
git clone https://github.com/ninja-build/ninja.git
cd ninja && ./configure.py --bootstrap && cd ..
export PATH="$PATH":pwd/ninja
编译v8
fetch v8 && cd v8&& gclient sync
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug
最后编译出的 输出在如下位置:
./out/x64.debug/d8
./out/x64.debug/shell
v8调试:
v8的官方团队编写了一个gdb的gdbinit脚本,使得在gdb中就能可视化显示v8的对象结构。在~/chrome_v8/v8/tools/gdbinit
将其添加到~/.gdbinit即可启用v8的调试功能:
┌──(kali㉿kali)-[~]
└─$ cat .gdbinit
#source ~/peda/peda.py
source /home/kali/Desktop/pwndbg-dev/gdbinit.py
source ~/Pwngdb/pwngdb.py
source ~/Pwngdb/angelheap/gdbinit.py
source ~/chrome_v8/v8/tools/gdbinit
#set context-output /dev/pts/1
define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end
调试指令:
gdb d8
set args --allow-natives-syntax ./exp/exp.js
在加载d8时加入这个选项就可以在js中调用一些调试函数:
%DebugPrint(obj) 输出对象地址
%SystemBreak() 触发调试中断主要结合gdb等调试器使用
比如说下面这个JS文件:
var a = [1,2,3];
var b = [1.1, 2.2, 3.3];
var c = [a, b];
%DebugPrint(a);
%SystemBreak(); //触发第一次调试
%DebugPrint(b);
%SystemBreak(); //触发第二次调试
%DebugPrint(c);
%SystemBreak(); //触发第三次调试
我们可以使用job命令,这个命令可以可视化显示JavaScript对象的内存结构。用telescope命令查看内存数据。
pwndbg> job 0x3ca000062079
0x3ca000062079: [FixedArray]
- map: 0x3ca00000067d <Map(FIXED_ARRAY_TYPE)>
- length: 3
0: 1
1: 2
2: 3
pwndbg> telescope 0x3ca000062078
00:0000│ 0x3ca000062078 ◂— 0x60000067d
01:0008│ 0x3ca000062080 ◂— 0x400000002
02:0010│ 0x3ca000062088 ◂— 0x10c900000006
03:0018│ 0x3ca000062090 ◂— 0x6207900000000
04:0020│ 0x3ca000062098 ◂— 0x6000008a1
05:0028│ 0x3ca0000620a0 ◂— 0x3ff199999999999a
06:0030│ 0x3ca0000620a8 ◂— 0x400199999999999a
07:0038│ 0x3ca0000620b0 ◂— 0x400a666666666666 ('ffffff\n@')