# 3.a. v8gen.py를 이용한 빌드 ./tools/dev/v8gen.py x64.release ninja -C ./out.gn/x64.release ./tools/dev/v8gen.py x64.debug ninja -C ./out.gn/x64.debug # 3.b. gm.py를 이용한 빌드 tools/dev/gm.py x64.release # 그냥 일반 V8 tools/dev/gm.py x64.debug # debuging 할 때 유용한 V8 실행"> # 3.a. v8gen.py를 이용한 빌드 ./tools/dev/v8gen.py x64.release ninja -C ./out.gn/x64.release ./tools/dev/v8gen.py x64.debug ninja -C ./out.gn/x64.debug # 3.b. gm.py를 이용한 빌드 tools/dev/gm.py x64.release # 그냥 일반 V8 tools/dev/gm.py x64.debug # debuging 할 때 유용한 V8 실행"> # 3.a. v8gen.py를 이용한 빌드 ./tools/dev/v8gen.py x64.release ninja -C ./out.gn/x64.release ./tools/dev/v8gen.py x64.debug ninja -C ./out.gn/x64.debug # 3.b. gm.py를 이용한 빌드 tools/dev/gm.py x64.release # 그냥 일반 V8 tools/dev/gm.py x64.debug # debuging 할 때 유용한 V8 실행">
#!/bin/bash
# 1. git clone
git clone <https://chromium.googlesource.com/chromium/tools/depot_tools.git>
# 2. 빌드 준비
export PATH=`pwd`/depot_tools:"$PATH"
fetch v8
cd v8
./build/install-build-deps.sh
sudo apt-get install ninja-build
# optional: 특정 버전으로 빌드하고 싶은 경우 commit version을 넣습니다
# CVE에 따라 변경 해야 되는 부분이다
git checkout 6538a20aa097f9c05ead98eb88c71819aa1e65aa
gclient sync
# optional: ctf등에서 patch파일이 주어지는 경우, 해당 파일로 patch해줍니다
# git apply <patchfile>
# 3.a. v8gen.py를 이용한 빌드
./tools/dev/v8gen.py x64.release
ninja -C ./out.gn/x64.release
./tools/dev/v8gen.py x64.debug
ninja -C ./out.gn/x64.debug
# 3.b. gm.py를 이용한 빌드
tools/dev/gm.py x64.release # 그냥 일반 V8
tools/dev/gm.py x64.debug # debuging 할 때 유용한 V8 실행
./~/v8/out.gn/x64.release/d8
debug와 외관적인 차이는 없어보인다.
./x64.release/d8 test.js
// test.js
a = [1, 2.2, "A", , 1];
%DebugPrint(a);
위 차이를 알기 위해서는 위와 같은 코드를 통해 할 수 있다.
위 코드는 JavaScript에서 볼 수 없던 함수인, %(function)
형의 함수를 사용한다.
해당 형식의 코드는 --allow-natives-syntax를 허락하였을 때 사용할 수 있으며, 디버깅에 사용한다.
%DebugPrint()
: 해당 객체의 세부 정보를 출력한다.
%SystemBreak()
: int 3
을 호출한다.
그리고 차이중 하나인 DCHECK
는 d8이 디버그 모드로 활성화되는 경우 동작하며, 추가적인 검사를 수행한다. --allow-natives-syntax를 사용할 경우 활성화 되며, 추가적인 검사들이 진행된다. PoC를 실행할 때 SIGABRT가 발생하기 전까지 디버깅을 잘 조절하거나 해당 DCHECK를 제거해야된다.
위와 같은 --allow-natives-syntax나 DCHECK가 트리거 되지 않으면 Debug와 release는 큰 차이가 없다.
gdb를 실행하는 방식은 일반 ELF와 동일하다. gdb ./x64.debug/d8
로 gdb를 연결하고 실행을 할 때는 r test.js
로 실행한다.cㅊ를 사용하기 위해서는 r --allow-natives-syntax test.js로 사용할 수 있다.
gdb에서 사용할 수 있는 명령어는 동일하게 적용된다.
~/.gdbinit에 특정 멍령어를 추가하게 되면 아래와 같은 기능들을 사용할 수 있다.