记录一下v8的配置过程以及在ctf比赛或者cve漏洞复现中需要用到的一些东西。
其实v8的配置本来很简单的,但是因为GFW的存在,变得有点复杂,上周甚至差点把我弄崩溃了,主要是在代理设置过程,对ubuntu下代理设置不太懂,太蛋疼了。
设置代理
v8配置需要用git获取depot_tools,并且depot_tools中的脚本下载了google git的文件,也需要代理才行,ubuntu下代理比较蛋疼,前面迷糊了好久,之后大概懂了。
ubuntu下大概有两个代理设置,分别是系统设置里的网络代理,全局变量代理设置,加上git的话是三个。系统设置里的网络代理好像是系统层面的对协议进行代理。这个设置很迷,设置完后某些流量是走代理了,但是并不是所有的,最后还是会出问题,这里就不用了。需要设置的地方主要是下面两个。
首先是git代理,git的代理设置就不用多说了
1 | git config --global http.proxy socks5://ip:port |
然后是全局变量代理,curl
等命令可能会用到,通过下面方式设置一下http_proxy和https_proxy,写入~/.bashrc,并且重新加载一下(注意前面git的代理是socks代理,这里是http代理,之前就是因为这个设置错了好久都没发现):
1 | export http_proxy="http://ip:port/" |
编译V8
获取depot_tools
通过git获取depot_tools并将其添加进path,更新一下。
1 | git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git |
获取v8源码与编译
获取源码
利用depot_tools去获取v8的源码
1 | mkdir v8 && cd v8 |
切换分支
对于一般的ctf题目或者说cve复现,都会给出下图的信息(patch版本或者存在漏洞的版本的hash均可)。
如果是漏洞信息的话,直接回滚到对应版本;如果给定的是patch的信息,则需要通过其parent信息回滚到漏洞版本。之后进行同步。
1 | git reset --hard [commit hash with vulnerability] |
编译
编译的话,有几个选择,大的方向是debug版本与release版本两种。选择哪种主要取决于题目的要求。
debug版本编译
1 | tools/dev/v8gen.py x64.debug |
release版本编译
为了既能对执行过程进行调试,又能使用gdb-v8-support.py插件的job等命令,可以在编译release版本前,在out.gn/x64.release/args.gn文件中增加以下编译选项:
1 | v8_enable_backtrace = true |
之后的方式就是参照上面的debug版本编译命令简单替换:
1 | tools/dev/v8gen.py x64.release |
调试
gdb配置
编译完可以直接运行v8,也就是d8:
1 | # release版本的话 |
v8中附带了很多协助gdb调试的命令,将如下命令写入~/.gdbinit来引用:
1 | source /path/to/v8/tools/gdbinit |
运行d8时,–allow-natives-syntax 选项开启可以使用一些v8运行时的支持函数,以便于本地调试,配合–allow-natives-syntax 选项在js源码中调用这些函数进行运行时分析,其中用的比较多的是下面两个:
1 | %DebugPrint(obj); // 输出对象的信息 |
gdb调试
启动gdb调试,一般步骤:
1 | cd /path/to/v8/out.gn/x64.release |
一些常用的命令:
1 | job obj_ptr(address)#查看某个地址作为对象指针的对象的详细信息 |
相关学习资源
关于v8
- v8 Base
- V8 javascript engine代码阅读
- 《JavaScript 引擎 V8 执行流程概述》
- 《ArrayBuffer,二进制数组》
- 《V8 是怎么跑起来的 —— V8 中的对象表示》
- 《奇技淫巧学 V8 之二,对象在 V8 内的表达》
- 《V8 Bug Hunting 之 JS 类型对象的内存布局总结》
关于v8 exp
- 《GToad Blog》
- 《从一道CTF题零基础学V8漏洞利用》
- 《CVE-2019-5782 v8数组越界 漏洞复现》
- v8利用入门:从越界访问到RCE
- StarCTF 2019 (*CTF) oob 初探V8漏洞利用
- Chrome v8 exploit - OOB
- *CTF2019 OOB-v8 Writeup
- star ctf Chrome oob Writeup
- *CTF 2019 – Chrome oob-v8
- Exploiting v8: *CTF 2019 oob-v8