V8_base
v8
前言
v8是chrome浏览器的JavaScript解析引擎,v8编译后二进制名称叫d8而不是v8
基础知识
介绍了V8中各个组件的功能以及工作流程
解析JS语句的基本流程
![[Pasted image 20221014222038.png]]
![[Pasted image 20221014222052.png]] v8在读取js语句后,首先将这一条语句解析为语法树,然后通过解释器将语法树变为中间语言的Bytecode字节码,经过优化将字节码转换为机器码来执行。
v8读取js语句→语法树→中间语言的Bytecode字节码+优化→机器码
JSArray内存展示
JSArray | ElementsKind |
---|---|
[1,2,3] | PACKED_SMI_ELEMENTS |
[1,,,,,,2,3] | HOLEY_SMI_EMELENTS |
[1.1,1.2] | PACKED_DOUBLE_ELEMENTS |
[{},1.1,2] | PACKED_ELEMENTS |
JIT优化
为了加快解析过程,v8会记录下某条语法树的执行次数,当v8发现某条语法树执行次数超过一定阀值后,就会将这段语法树直接转换为机器码。后续再调用这条js语句时,v8会直接调用这条语法树对应的机器码,而不用再转换为ByteCode字节码,这样就大大加快了执行速度
v8对象结构
以上面的数组对象b为例,通过job命令可以看到一个对象在内存中布局大致如下所示:
diff代码
diff文件的相关内容
V8调试
v8 中内置了一些 runtime 函数,可以在启动 d8 时追加--allow-natives-syntax
参数来启动内置函数的使用。
%PrepareFunctionForOptimization
是 v8 众多内置函数中的其中一个。该函数可以为 JIT 优化函数前做准备,确保 JSFunction 存在 FeedbackVector等相关的结构(在必要时甚至会先编译该函数)。
// 调用链如下
Runtime_PrepareFunctionForOptimization
bool EnsureFeedbackVector(Handle<JSFunction> function)
void JSFunction::EnsureFeedbackVector(Handle<JSFunction> function)
由于该内置函数只是为对应的 JSFunction 准备 FeedbackVector(请记住这个准备操作),因此可以通过多次调用目标函数来准备 FeedbackVector,替换该内置函数的调用。
内存结构
elements ----> +------------------------+
| MAP +<---------+
+------------------------+ |
| element 1 | |
+------------------------+ |
| element 2 | |
| ...... | |
| element n | |
ArrayObject ---->-------------------------+ |
| map | |
+------------------------+ |
| prototype | |
+------------------------+ |
| elements | |
| +----------+
+------------------------+
| length |
+------------------------+
| properties |
+------------------------+
切换版本
git checkout 8.1.307
gclient sync
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug
环境搭建
sudo apt-get update
sudo apt install build-essential
sudo apt-get update && sudo apt-get install pkg-config
sudo apt install python
//git代理配置
//git config --global http.proxy <http://ip>:port
//git config --global http.proxy http://192.168.174.1:7890
git config --global http.proxy http://172.26.240.1:7890
//环境变量
export http_proxy="http://192.168.174.1:7890"
//export http_proxy="http://172.26.240.1:7890"
export https_proxy=$http_proxy
//安装depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
//echo 'export PATH=$PATH:"/path/to/depot_tools"' >> ~/.bashrc
echo 'export PATH=$PATH:"/home/v/depot_tools"' >> ~/.bashrc
//安装ninja
git clone https://github.com/ninja-build/ninja.git
cd ninja && ./configure.py --bootstrap && cd ..
//echo 'export PATH=$PATH:"/path/to/ninja"' >> ~/.bashrc
echo 'export PATH=$PATH:"/home/v/ninja"' >> ~/.bashrc
//编译v8
bash
fetch v8
cd v8
git reset --hard [commit hash with vulnerability]
//如果编译最新版的话,就不用这行命令
//如果是要调洞的话,就要在这里切到有漏洞的那个commit
gclient sync
//gclient sync 用来下载一些其他需要的东西,
//这个还需要curl的代理,之前也已经在环境变量配置了
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug
//如果只是想编译d8的话(这样更快),最后一个命令后面加个d8的参数ninja -C out.gn/x64.debug d8
//编译release版本的话,最后两行改成这个。
//tools/dev/v8gen.py x64.release
//ninja -C out.gn/x64.release
//Turbolizer搭建
sudo apt-get install curl software-properties-common
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
cd tools/turbolizer/
npm i
npm run-script build
python -m SimpleHTTPServer
//参考链接
//https://bbs.pediy.com/thread-252812.htm
//gdb环境
source /home/v/v8/tools/gdbinit
source /home/v/v8/tools/gdb-v8-support.py
//npm
npm config set proxy=http://192.168.174.1:7890
npm config set registry=http://registry.npmjs.org
学习资料
Turbofan
没基础看的不是很懂,里面写的也是一言难尽
IPC
【DC010技术沙龙】Chrome IPC机制研究及漏洞挖掘 介绍了一下构造IPC Fuzzer的思路,利用的pykd框架
pdfium
利用生成式fuzz挖掘Chrome PDFium漏洞
历史漏洞
https://cloud.tencent.com/developer/article/1005712 # Google Chrome pdfium shading drawing 整数溢出导致远程代码执行
Issue 770148(CVE-2017-15411)
![[Pasted image 20221007131222.png]]
Issue 982397
![[Pasted image 20221007131525.png]]
漏洞模式
UAF漏洞模式
![[Pasted image 20221007131803.png]]