V8,真男人开V8!

环境搭建

测试环境:ubuntu 24.04.2 | Dell Inspiron 3501 | i5-1135G7(对的,是物理机,后面编译时间仅供参考)

依赖安装

大前提:科学上网!!!如果你用的是虚拟机或者wsl环境,请确保你能正常访问谷歌和github。另外确保正确安装了make。

先装一些基础依赖,但是这里大部分都是正常做题环境已经装了的

1
sudo apt install bison cdbs curl flex g++ git vim pkg-config

后续大概率(因为试过编译没用到的情况,但是不知道怎么触发)需要用到python2,因为我用的是ubuntu24已经不支持软件管理包下载python2了,这里记录一下从源码编译。这个编译很快就可以完成,大概也就一两分钟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载源码压缩包
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
# 解压
tar -xJf Python-2.7.18.tar.xz
# 切入源码目录
cd Python-2.7.18
# 设置编译选项并写入 Makefile
./configure
# 编译
make
# 安装
sudo make install
# 测试,正常来说python可以直接启动python2, 但python3需要写上3
python --version

安装depot_tools

先找好存放这些工具的目录,然后👇

1
2
3
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

echo "export PATH=$(pwd)/depot_tools:${PATH}" >> ~/.bashrc

后面这个bashrc取决于你的shell是什么,如果你是zsh,那就是zshrc。然后重启shell来使环境变量生效,后续部分命令会来自于这个文件夹。

安装ninja

ninja可以加速大型项目编译

先找好要安装ninja的位置,这个的安装也是很快就能完成

1
2
3
git clone https://github.com/ninja-build/ninja.git
cd ninja && ./configure.py --bootstrap && cd ..
echo "export PATH=$(pwd)/ninja:${PATH}" >> ~/.bashrc

然后重启shell来使环境变量生效,后续部分命令会来自于这个文件夹。注意上面的两次重启需要分别进行,不然……不然你看看你的bashrc呢(doge

获取v8源码

官方文档推荐用tools里的fetch来下载源码,而非简单地从github上拉取,实际上两个我都试过了,但是fetch虽然上网的问题比较麻烦,但是后续编译起来是发生问题最少的。

1
fetch v8

这个fetch是来自于depot_tools的,当你环境变量不生效,告诉你fetch不存在时,千万别用snap安装,那个是不一样的。你可以从depot_tools文件夹手动引用这个程序来执行。fetch v8需要一点时间,下载下来的文件大概有两个G,所以请确保科学上网。

一些tips:

  1. fetch这个程序不会告诉你进度,所以到底有没有在下载东西是看不到的,他的超时时间很长所以当你看到他告诉你连接失败的时候会有点红温。解决办法是,将depot_tools文件夹下的cipd_bin_setup.sh文件第26行-log-level参数改成info,这样就能看到实时进度,看看有没有卡住。
  2. 如果发现明明挂了代理,但是还是连接失败的,可以试试先在浏览器或者ping一下https://chromium.googlesource.com/v8/v8.git,估计是会有缓存啥的,如果浏览器里能正常打开的话,再fetch就能联通了,真神奇。

编译d8

终于到了激动人心的编译环节,v8编译出来的可执行文件叫d8,其实是用来调试v8的文件,也就是debug for v8(我的理解),我们要调试和pwn的东西也就是这个d8。

编译最新版d8

1
2
3
4
5
6
7
$ cd v8
# 同步并安装一些依赖
$ gclient sync
# jinja编译文件生成
$ gn gen out/x64.release --args='v8_monolithic=true v8_use_external_startup_data=false is_component_build=false is_debug=false target_cpu="x64" use_goma=false goma_dir="None" v8_enable_backtrace=true v8_enable_disassembler=true v8_enable_object_print=true v8_enable_verify_heap=true'
# 编译
$ ninja -C out/x64.release

gclient是来自depot_tools文件夹的,gn和ninja来自ninja文件夹。

v8_monolithic=true这一句允许d8文件单独迁移。

d8会生成在{pwd}/out/x64.release

这里也有一些tips:

  1. 可以打开System Monitor,在运行gclient的时候看看网络有没有动,如果没动,回显也卡住了的话,大概率是网络寄了。
  2. 如果已经不是第一次编译了,运行的环境已经安装好了的话,可以考虑只编译d8这一个文件,使用这行命令ninja -C out/x64.release d8。全部编译需要编译2300+文件,耗时20多分钟,只编译d8则需要编译1200+文件,耗时不到十分钟。

编译题目patch后的d8

用starctf2019那题oob做例子

1
2
3
4
5
6
7
$ git clone https://github.com/sixstars/starctf2019.git
$ cd v8
$ git reset --hard 6dc88c191f5ecc5389dc26efa3ca0907faef3598
$ git apply ../starctf2019/pwn-OOB/oob.diff
$ gclient sync
$ gn gen out/x64_starctf.release --args='v8_monolithic=true v8_use_external_startup_data=false is_component_build=false is_debug=false target_cpu="x64" use_goma=false goma_dir="None" v8_enable_backtrace=true v8_enable_disassembler=true v8_enable_object_print=true v8_enable_verify_heap=true'
$ ninja -C out/x64_starctf.release d8

主要是reset控制源码版本,apply加入出题人的人造漏洞。其他步骤相同。

gdb载入v8调试脚本

先下载这个文件https://chromium.googlesource.com/v8/v8.git/+/refs/heads/main/tools/gdb-v8-support.py

然后下载这个文件https://chromium.googlesource.com/v8/v8.git/+/refs/heads/main/tools/gdbinit

在你的~/.gdbinit开头中加入source /path/to/your/gdb-v8-support.py

然后将下载下来的gdbinit的内容加入到你的gdbinit文件的后面。这样在pwndbg中就可以用官方的调试命令来调试v8了。

然后就开始开心地调试v8吧

⬆︎TOP