0%

V8配置与常用调试

记录一下v8的配置过程以及在ctf比赛或者cve漏洞复现中需要用到的一些东西。

其实v8的配置本来很简单的,但是因为GFW的存在,变得有点复杂,上周甚至差点把我弄崩溃了,主要是在代理设置过程,对ubuntu下代理设置不太懂,太蛋疼了。

设置代理

v8配置需要用git获取depot_tools,并且depot_tools中的脚本下载了google git的文件,也需要代理才行,ubuntu下代理比较蛋疼,前面迷糊了好久,之后大概懂了。

​ubuntu下大概有两个代理设置,分别是系统设置里的网络代理,全局变量代理设置,加上git的话是三个。系统设置里的网络代理好像是系统层面的对协议进行代理。这个设置很迷,设置完后某些流量是走代理了,但是并不是所有的,最后还是会出问题,这里就不用了。​需要设置的地方主要是下面两个。

​首先是git代理,git的代理设置就不用多说了

1
2
git config --global http.proxy socks5://ip:port
git config --global https.proxy socks5://ip:port

然后是全局变量代理,curl等命令可能会用到,通过下面方式设置一下http_proxy和https_proxy,写入~/.bashrc,并且重新加载一下(注意前面git的代理是socks代理,这里是http代理,之前就是因为这个设置错了好久都没发现):

1
2
export http_proxy="http://ip:port/"
export https_proxy=$http_proxy

编译V8

获取depot_tools

通过git获取depot_tools并将其添加进path,更新一下。

1
2
3
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:/path/to/depot_tools #source ~/.bashrc
gclient

获取v8源码与编译

获取源码

利用depot_tools去获取v8的源码

1
2
mkdir v8 && cd v8
fetch v8

切换分支

对于一般的ctf题目或者说cve复现,都会给出下图的信息(patch版本或者存在漏洞的版本的hash均可)。

如果是漏洞信息的话,直接回滚到对应版本;如果给定的是patch的信息,则需要通过其parent信息回滚到漏洞版本。之后进行同步。

1
2
git reset --hard [commit hash with vulnerability]
gclient sync

编译

编译的话,有几个选择,大的方向是debug版本与release版本两种。选择哪种主要取决于题目的要求。

debug版本编译

1
2
3
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug
ninja -C out.gn/x64.debug d8 #如果只编译d8的话,可以更快

release版本编译

为了既能对执行过程进行调试,又能使用gdb-v8-support.py插件的job等命令,可以在编译release版本前,在out.gn/x64.release/args.gn文件中增加以下编译选项:

1
2
3
4
v8_enable_backtrace = true
v8_enable_disassembler = true
v8_enable_object_print = true
v8_enable_verify_heap = true

之后的方式就是参照上面的debug版本编译命令简单替换:

1
2
3
tools/dev/v8gen.py x64.release
ninja -C out.gn/x64.release
ninja -C out.gn/x64.release d8 #如果只编译d8的话,可以更快

调试

gdb配置

编译完可以直接运行v8,也就是d8:

1
2
3
4
5
# release版本的话
# 启动交互的d8 shell
./out.gn/x64.release/d8
# 用d8跑test.js
./out.gn/x64.release/d8 test.js

v8中附带了很多协助gdb调试的命令,将如下命令写入~/.gdbinit来引用:

1
2
3
source /path/to/v8/tools/gdbinit
source /path/to/v8/tools/gdb-v8-support.py
source /path/to/pwndbg/gdbinit.py //这是pwndbg所带

运行d8时,–allow-natives-syntax 选项开启可以使用一些v8运行时的支持函数,以便于本地调试,配合–allow-natives-syntax 选项在js源码中调用这些函数进行运行时分析,其中用的比较多的是下面两个:

1
2
%DebugPrint(obj); 	// 输出对象的信息
%SystemBreak(); // 触发调试中断,结合调试器使用

gdb调试

启动gdb调试,一般步骤:

1
2
3
4
5
6
7
8
9
cd /path/to/v8/out.gn/x64.release
gdb ./d8
#下面是gdb命令
#设置d8的输入参数 --allow-natives-syntax 开启支持函数
set args --allow-natives-syntax /path/to/test.js
# 启动程序
r
#在%SystemBreak() 处中断
c

一些常用的命令:

1
2
job obj_ptr(address)#查看某个地址作为对象指针的对象的详细信息
telescope [-h] [address] [count]#从指定地址开始递归解引用指针 ,就是查看内存数据

相关学习资源

关于v8

关于v8 exp