什么是V8
解释,执行Javascript代码的引擎
- 自身是C++实现
- 解析Javascript 代码,构造AST(抽象语法树)
- 基于AST,通过JIT编译器将其转换为汇编,执行
AST 抽象语法树大概是这样(以a+b为例):
V8也可以单独运行,一般是和其他项目一起被使用,例如Google Chrome,Node.js等
##V8 Exploit之前
首先,我们需要了解V8的构造
- 并不需要全部了解(V8的代码更新很快)
- 但了解基本的概念是必须的
从Exploit角度深入了解
- 创建任意地址读写原语是否容易?
- 是否能够早稳定的Exploit
这份PPT中主要讲解2016年4月的v8的结构,如果想了解现在的v8,可以参考这些资料:
- https://www.slideshare.net/ssuser6f246f/v8-javascript-engine-for
- https://speakerdeck.com/brn/source-to-binary-journey-of-v8-javascript-engine
V8的编译器和优化
编译器的种类
V8最重要的组件就是编译器
内部大体上是这4种编译器:
- 旧的baseline编译器:Full-Codegen
- 旧的优化编译器:Crankshaft
- 新的优化编译器:TurboFan
- 新的baseline编译器:Ignition
下面这些资料可以用于参考:
编译器的历史
V8内部编译器的变迁:
- 最初,Full-Codegen直接生成和执行机器语言
- 从AST生成机器代码(JIT)比较快,但生成的机器代码有很多冗余,有待进一步优化
- 2010年,针对hot-code优化目的,引入了Crankshaft
- 调用频率较高,机器代码生成时间还能再减少,判断可以更优化的代码
- 2015年,因为Crankshaft适配JavaScript的新规范比较麻烦,引入了新的TurboFan
- 2017年,为了维护效率,引入了用于生成中间代码的Ignition
- TurboFan专门优化中间代码
- 2018年至今,Full-Codegen和Crankshaft结束寿命,被删除
回到例题
例题是2016年当时的latest
- 存在Full-Codegen,Crankshaft,TurboFan
- Hidden Class + Inline Caching也被用于优化
编译器与优化
- Baseline编译器
- Full-Codegen (对于这次例题exp的重要程度低)
- 优化机制
- Hidden Class (更准确的说,Hidden Class是为自身加速的机制,而Inline Caching是以Hidden Class的信息为基础,进行优化的机制)
- Inline Caching
- 优化编译器
- Crankshaft
- TurboFan
各种编译器在V8源码的src目录中:
其他应该知道的: