什么是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,可以参考这些资料:

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编译器
    1. Full-Codegen (对于这次例题exp的重要程度低)
  • 优化机制
    1. Hidden Class (更准确的说,Hidden Class是为自身加速的机制,而Inline Caching是以Hidden Class的信息为基础,进行优化的机制)
    2. Inline Caching
  • 优化编译器
    1. Crankshaft
    2. TurboFan

各种编译器在V8源码的src目录中:

其他应该知道的: