0%

v8环境搭建

前言

搭个环境而已,花了我n久,哭泣。。。

这里就讲下自己搭环境的经过,,,


使用的环境:ubuntu 18.04

初次尝试:本地

参考博客

主要参考的是这两篇博客:

https://eternalsakura13.com/2018/05/06/v8/

https://bbs.pediy.com/thread-252812.htm


vpn

我的本地代理,开了没用,不知道为什么,本机可以上google,但是虚拟机里怎么都不可以,,,然后,,选择在虚拟机里面使用vpn

这个是我用的:https://neworld.date/user(简单好用而且不贵)

linux的教程:https://support.neworld.date/linux/(不要用自动配置,一次性的,后面出问题了,还是要上手动配置)

别的问题不大,注意的两点是:

1.要使用的时候,需要在命令前面加上proxychains4

2.选择节点的时候,一定要选择有人的

3.一定是root账户

4.在/root目录下

执行命令 proxychains4 curl myip.ipip.net 。如果显示empty server类似的

那就重新来一遍(建议:wmware弄个快照,,每次都重新配,心真的很累),,,我当时玄学,学校里的网不行(貌似是因为校园网不能翻外网),连了自己的热点就可以了。

环境搭建

依赖

1
apt-get install binutils python2.7 perl socat git build-essential gdb gdbserver

工具

depot_tools

这个工具是用来得到v8源码的

1
2
3
root$ cd ~
(proxychains4 )git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo 'export PATH=$PATH:"/root/depot_tools"' >> ~/.bashrc
ninja

这个工具是用来编译v8的

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

echo两句命令,主要是写入环境变量,后期fetch v8的时候,可能会说找不到fetch命令,可能就是环境变量没了,可以通过vim ~/.bashrc,查看最后面是否有下面这两句话,没有的话,加上

1
2
3
export PATH=$PATH:"/root/depot_tools"
export PATH=$PATH:"/root/ninja"
bash //载入环境变量

然后就是编译启动,我卡死在了v8,真的很慢,而且最后报错,,,出错,网上看了好多,也没解决,,,TAT

后面的步骤

v8编译

1
2
3
$ fetch v8 && cd v8&& gclient sync
$ tools/dev/v8gen.py x64.debug
$ ninja -C out.gn/x64.debug

启动

1
2
$ ./out/x64.debug/d8
$ ./out/x64.debug/shell

初始尝试失败,,搞了好久都没出来,,,,但是网上大部分都是这种方法


二次尝试

参考博客:

https://eternalsakura13.com/2018/06/26/v8_environment/

服务器

sakura为我们提供了第二种方法,我一开始试了下,但是谷歌云搞不来,没有信用卡啥的。但是后来只能尝试这个,所以找了下其他国外的云服务器。

不需要代理啥的,真是舒服。

知乎上的这篇给了较好的帮助:https://zhuanlan.zhihu.com/p/130402190

我使用的是狗云,进来,“创建景点云服务器”,我一开始用的10G的硬盘,编译的时候发现太小了,然后只好销毁重来一个(这个只要三个工作日内,支持销毁退款)

操作系统选择这个:CentOS 7 BBR,ubuntu 18我也用了,但还是出问题了

image-20201010130803778

然后进入“我的经典云服务器”,启动,用xshell远程连过去

image-20201010131058668

环境搭建

fetch源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo yum groupinstall "Development Tools"  
sudo yum install -y git gdb bzip2 wget
cd ~
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"
mkdir v8
cd v8
fetch v8
cd ~/v8/v8
git reset --hard 6dc88c191f5ecc5389dc26efa3ca0907faef3598(2019-starctf这道入门题)
gclient sync
./tools/dev/v8gen.py x64.release(这个真的很慢,要耐心)
ninja -C ./out.gn/x64.release # Release version
./tools/dev/v8gen.py x64.debug
ninja -C ./out.gn/x64.debug # Debug version
release版本和debug版本

上面的12-15行中,12-13两行下载的是release版本,14-15行下载的是debug版本。release版本可以正常运行,但是有些调试信息不能用,如job命令,执行起来的时候,也会告诉我们,没有调试的符号。

1
2
3
pwndbg: loaded 186 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Reading symbols from ./d8...(no debugging symbols found)...done.

debug就是调试版本,可以输入更多的调试信息。虽然debug看着好,但是,,,后面有点问题,,,两个都下过来就好。

image-20201015161210557

下过来之后,是这样的。

我们进入x64.debug就可以调试状态下运行d8。。同理release

搭建ftp服务器

1
2
3
4
5
6
cd ~
tar -czvf v8.tar v8
sudo yum install vsftpd -y
systemctl start vsftpd.service(在CentOS7和它之前,启动vsftpd服务的指令是 service vsftpd start,之后要使用新指令)
sudo netstat -nltp | grep 21
cp v8.tar /var/ftp/

然后,浏览器就可以访问到了,点击下载即可。

image-20201011095616016

哇哇哇哇,感天动地,终于搞定了。

测试

实例程序(test.js):

1
2
3
4
5
6
7
8
9
var a = [1,2,3];
var b = [1.1, 2.2, 3.3];
var c = [a, b];
%DebugPrint(a);
%SystemBreak(); //触发第一次调试
%DebugPrint(b);
%SystemBreak(); //触发第二次调试
%DebugPrint(c);
%SystemBreak(); //触发第三次调试

v8的gdb

1
2
3
4
5
6
7
8
cd ~/v8/v8/tools
mv gdbinit gdbinit_v8
cp gdbinit_v8 ~/.gdbinit_v8
cd ~
vim .gdbinit
#加入下面内容
source ~/.gdbinit_v8
source ~/v8/v8/tools/gdb-v8-support.py

命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cd ~/v8/v8/out.gn/x64.debug/
将test.js放到该目录下
gdb ./d8
gdb-peda$ set args --allow-natives-syntax ./test.js
gdb-peda$ r
pwndbg> r
Starting program: /home/winter/v8/v8/out.gn/x64.debug/d8 --allow-natives-syntax ./test.js
[...]
DebugPrint: 0x3847d864df19: [JSArray]
- map: 0x27aca0f42d99 <Map(PACKED_SMI_ELEMENTS)> [FastProperties]
- prototype: 0x33ab2b711111 <JSArray[0]>
- elements: 0x3847d864de39 <FixedArray[3]> [PACKED_SMI_ELEMENTS (COW)]
- length: 3
- properties: 0x27d6f1300c71 <FixedArray[0]> {
#length: 0x1f78960401a9 <AccessorInfo> (const accessor descriptor)
}
- elements: 0x3847d864de39 <FixedArray[3]> {
0: 1
1: 2
2: 3
}

pwndbg> job 0x3847d864df19(这个地址根据第九行那里显示地址)
0x3847d864df19: [JSArray]
- map: 0x27aca0f42d99 <Map(PACKED_SMI_ELEMENTS)> [FastProperties]
- prototype: 0x33ab2b711111 <JSArray[0]>
- elements: 0x3847d864de39 <FixedArray[3]> [PACKED_SMI_ELEMENTS (COW)]
- length: 3
- properties: 0x27d6f1300c71 <FixedArray[0]> {
#length: 0x1f78960401a9 <AccessorInfo> (const accessor descriptor)
}
- elements: 0x3847d864de39 <FixedArray[3]> {
0: 1
1: 2
2: 3
}

v8的gdb也可以了

更新

1
tools/dev/gm.py x64.debug d8
Q:如果阅读本文需要付费,你是否愿意为此支付1元?