타겟 빌드
V8 빌드 도구(depot_tools) 다운
ninja나 관련된 모든 빌드 도구들이 depot_tools에 들어있다.
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:$(pwd)/depot_tools
V8 소스코드 다운
fetch v8
cd v8
# 특정 CVE가 수정되기 전의 특정 커밋으로 이동 (예: 2024년 3월 중순)
git checkout 28877c5520
gclient sync

V8 빌드 (d8 쉘 생성)
./tools/dev/gm.py x64.debug
./tools/dev/gm.py x64.release
V8 실행
./out.gn/x64.release/d8 *.js
# 혹은
./out/x64.release/d8 *.js

V8 디버깅
v8을 디버깅한다는 것은 v8의 쉘 역할을 해주는 d8 바이너리를 이용해서 .js 코드의 동작을 해석하는 브라우저 엔진의 동작을 분석한다는 뜻이다.

d8은 리눅스 바이너리이기 때문에 gdb를 이용해서 디버깅이 당연히 가능하다. 근데 이제 .js 파일을 인자로 받아서. 따라서 gdb를 실행할때 인자로 .js 파일을 넘겨주어여야 한다는 것만 생각하면 된다.
gdb <d8 바이너리>
# 이 시점에 브레이크 포인트 걸기
r --allow-natives-syntax <.js파일>
예시

트러블 슈팅
python3 /home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py -s ../../build/linux/debian_bullseye_amd64-sysroot -a x64 glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0
➜ v8 git:(afe6883a2a5) ./tools/dev/gm.py x64.debug
# mkdir -p /home/jun/CVE-2024-2887/v8/out/x64.debug
# echo > /home/jun/CVE-2024-2887/v8/out/x64.debug/args.gn << EOF
is_component_build = true
is_debug = true
symbol_level = 2
target_cpu = "x64"
v8_enable_sandbox = true
v8_enable_backtrace = true
v8_enable_fast_mksnapshot = true
v8_enable_slow_dchecks = true
v8_optimized_debug = false
EOF
# gn gen out/x64.debug
ERROR at //build/config/linux/pkg_config.gni:152:19: Script returned non-zero exit code.
pkgresult = exec_script(pkg_config_script, _script_args, "json")
^----------
Current dir: /home/jun/CVE-2024-2887/v8/out/x64.debug/
Command: python3 /home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py -s ../../build/linux/debian_bullseye_amd64-sysroot -a x64 glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0
Returned 1.
stderr:
Traceback (most recent call last):
File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 252, in <module>
sys.exit(main())
^^^^^^
File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 142, in main
prefix = GetPkgConfigPrefixToStrip(options, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 80, in GetPkgConfigPrefixToStrip
prefix = subprocess.check_output([options.pkg_config,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 466, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 548, in run
with Popen(*popenargs, **kwargs) as process:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 1026, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 1953, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'pkg-config'
See //build/config/linux/BUILD.gn:58:3: whence it was called.
pkg_config("glib") {
^-------------------
See //build/config/compiler/BUILD.gn:354:18: which caused the file to be included.
configs += [ "//build/config/linux:compiler" ]
^------------------------------
해결
sudo apt-get update
sudo apt-get install -y pkg-config libglib2.0-dev
'Configuration' 카테고리의 다른 글
| Ubuntu LLVM 설치 및 버전확인 방법 (export LLVM_CONFIG) (1) | 2024.02.10 |
|---|---|
| sudo시에 E: Could not get lock /var/lib/dpkg/lock-frontend 해결 (2) | 2023.11.22 |
| v8 engine Fuzzing을 위한 v8 컴파일 및 Fuzzilli Configuration (0) | 2022.09.03 |
| 우리 도커 이상한 애 아니다. (도커 사용법 / Docker file / Docker image / Docker container 와의 관계) (0) | 2022.03.06 |
| 그러니까 도커는.. (docker create/start/run/stop/rm/exec) (0) | 2022.03.06 |