• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Изучение эксплойтов V8 с нуля /начало/ (1)

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
Этой статьей я начну серию переводов китайских коллег о прекрасной стране - "Эксплуатация V8"

Прежде чем приступить к изучению V8, необходимо разобраться со средой эксплуотации. туториалов по сборке среды v8 в интернете довольно много. Когда мы создаем среду в Китае, по хорошо известным причинам мы столкнемся с первым узким местом, ВЕЛИКИМ КИТАЙСКИМ ФАЕРВОЛОМ, сетевыми решениями. Тем не менее, скорость сети самая высокая, когда окружение размещено на vps. Но тогда вы столкнетесь со вторым узким местом, БАНДОЙ ОФИГЕВШИХ СУМОИСТОВ - узким местом производительности. Общая производительность vps для самостоятельного использования составляет около 1c1g, и однажды компиляция заняла около 1 часа.

Есть принципиально разные версии эксплойтов. Изучить один и потратить на компиляцию около 1 часа - как сделать другу харакири. Вот я и подумал, есть ли готовая докерная среда, чтобы не тратить время на компиляцию, но подходящего докера не нашел, нашел только проект под названием docker-v8 , а там аж несколько версий, а Dockerfile и Makefile написаны неправильно, да и скомпилирована только последняя версия, и никакая другая версия не хотела компилироваться. Поэтому я внес некоторые изменения в этот проект, намереваясь скомпилировать его на моем mbp и собрать соответствующий докер самостоятельно. Но я не ожидал, что процессор i9 не очень хорош, это совсем дрянь, частота будет снижаться, как только нагреется, а яйца можно сварить где-то за 10 с. На компиляцию один раз уходит около получаса, плюс сетевой фактор, на выполнение всего процесса уходит около 1 часа. Затем я вспомнил, что некоторое время назад подарил своей девушке настольный компьютер с AMD 5950x, с технологией удаленного включени, но как оказалась потом и она не работала , и в итоге использовал Xiaomi Smart Socket, настроив рабочий стол на автоматическое включение, чтобы предоставить мне удаленный доступ.

Этот настольник был куплен для моей девушки, чтобы играть в игры, поэтому на нем был установлен windows без виртуальной машины. Однако WSL была установлена и скомпилирована непосредственно на WSL, маршрутизатор был openwrt, что позволило для работы использовать глобальный прокси, что в свою очередь решило проблему работы по сети. Наконец, целый набор процессов пошел на ура, и потребовалось всего около 5 минут, чтобы сгенерировать любую версию среды v8. Затем перетащите d8 локально, и вы сможете собрать соответствующую версию docker.

Создание среды

Ниже приводится подробное описание процесса, который я использовал для компиляции среды v8 в WSL.

1. Сначала установите соответствующие зависимости:
Код:
sudo apt install bison cdbs curl flex g++ git python vim pkg-config

2. Получите depot_tools:
Код:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

3. Установите переменную среды для depot_tools:
Код:
echo "export PATH=$(pwd)/depot_tools:${PATH}" >> ~/.zshrc

4.
Код:
fetch v8
Эта команда будет клонировать v8, v8 довольно большой, поэтому скорость этой команды зависит от условий сети

5. Установите зависимости, связанные с v8, зависимости шрифтов столкнутся с некоторыми сетевыми проблемами, даже если они используют прокси, но я не изучал уязвимости шрифтов, поэтому я не решил эту проблему, поэтому я не устанавливаю зависимости шрифтов напрямую:
Код:
./v8/build/install-build-deps.sh --no-chromeos-fonts

6. Дальше по учебнику делаем так

Код:
$ cd v8
$ gclient sync
$ 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 d8

Если скомпилированную среду v8 необходимо перенести, рекомендуется установить v8_monolithic=true, поэтому вам нужно перенести только один d8. Программа просто отличная. В противном случае вам придется перенести другие (моментальные) зависимости.

Выше приведена команда для компиляции последней версии окружения, но мне нужно компилировать любую версию, поэтому запилю ка я скриптец build.sh

Код:
$ cat build.sh
#!/bin/bash
VER=$1
if [ -z $2 ];then
        NAME=$VER
else
        NAME=$2
fi
cd v8
git reset --hard $VER
gclient sync -D
gn gen out/x64_$NAME.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_$NAME.release d8

Вот что из него выползло:

Код:
$ time ./build.sh "9.6.180.6"
HEAD is now at 67eacd3dce Version 9.6.180.6
Syncing projects: 100% (29/29), done.
Running hooks: 100% (27/27), done.
Done. Made 178 targets from 98 files in 244ms
ninja: Entering directory `out/x64_9.6.180.6.release'
[1839/1839] LINK ./d8
./build.sh "9.6.180.6"  4581.36s user 691.20s system 1586% cpu 5:32.41 total

Немного выпрямив извилины, решил изменить его Makefile:

Код:
$ cat Makefile
TAG:=$(tag)
IMAGE:=hcamael/v8

default: help

help:
    @echo 'V8/D8 ${TAG} Docker image build file'
    @echo
    @echo 'Usage:'
    @echo '    make clean           Delete dangling images and d8 images'
    @echo '    make build           Build the d8 image using local Dockerfile'
    @echo '    make push            Push an existing image to Docker Hub'
    @echo '    make deploy          Clean, build and push image to Docker Hub'
    @echo '    make github          Tag the project in GitHub'
    @echo

build:
    docker build --build-arg V8_VERSION=${TAG} -t ${IMAGE}:${TAG} .

clean:
    # Remove containers with exited status:
    docker rm `docker ps -a -f status=exited -q` || true
    docker rmi ${IMAGE}:latest || true
    docker rmi ${IMAGE}:${TAG} || true
    # Delete dangling images
    docker rmi `docker images -f dangling=true -q` || true

push:
    docker push docker.io/${IMAGE}:${TAG}
    docker tag ${IMAGE}:${TAG} docker.io/${IMAGE}:latest
    docker push docker.io/${IMAGE}:latest

deploy: clean build push

github:
    git push
    git tag -a ${TAG} -m 'Version ${TAG}'
    git push origin --tags


.PHONY: help build clean push deploy github

а затем модифицировал Dockerfile

Код:
$ cat Dockerfile
FROM debian:stable-slim

RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -yqq && \
    DEBIAN_FRONTEND=noninteractive apt-get install curl rlwrap vim -yqq gdb && \
    apt-get clean
ARG V8_VERSION=latest
ENV V8_VERSION=$V8_VERSION

LABEL v8.version=$V8_VERSION \
      maintainer="test@admin.com"
WORKDIR /v8

COPY /v8_$V8_VERSION/d8 ./

COPY vimrc /root/.vimrc

COPY entrypoint.sh /

RUN chmod +x /entrypoint.sh && \
    mkdir /examples && \
    ln -s /v8/d8 /usr/local/bin/d8

ENTRYPOINT ["/entrypoint.sh"]

Вот как то так.

Продолжение следует
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Докер конечно я не использую, но вообще это удобная вещь.

Вот моя заметка по настройке своей среды V8 в лине.

Настройка исследовательской среды, компиляция, отладка
Займёмся подготовкой исследовательской среды. Установим на VMware Workstation OS Ubuntu. Можно конечно использовать и другой дистрибутив линукса, но я выбрал именно его в пользу того, что это простой и популярный дистрибутив линукса.

Установили Ubuntu ? Хорошо, теперь обновимся и поставим некоторые инструменты.
Код:
sudo apt-get update
sudo apt-get upgrade


Обновились? Ставим компилятор, гит и питон.
Код:
sudo apt-get install gcc
sudo apt-get install git
sudo apt-get install python


Теперь установим pwndbg. Хотя можно выбрать gef или peda. Тут уже дело вкуса...
Код:
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

Установили ? Отлично. Теперь ставим V8.
Код:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
cd depot_tools && echo "export PATH=\$PATH:`pwd`" >> ~/.bashrc
source ~/.bashrc
cd ~ && mkdir chrome && cd chrome
fetch v8
cd v8
./build/install-build-deps.sh
git checkout <patch hash>
gclient sync
./tools/dev/v8gen.py x64.release
ninja -C ./out.gn/x64.release
./tools/dev/v8gen.py x64.debug
ninja -C ./out.gn/x64.debug

После компиляции мы получим два файла, дебаг и релиз версию. Да кстати скомпилированный бинарник v8 называется d8, а не v8.

Дебаг версия
/home/weaver/chrome/v8/out.gn/x64.debug/d8

Релиз версия
/home/weaver/chrome/v8/out.gn/x64.release/d8

Теперь после компиляции нам нужно настроить gdbinit для gdb (pwndbg). Официальная команда v8 написала скрипт gdbinit для gdb, который позволяет отображать визуально структуры объектов v8.

Открываем основной конфигурационный файл .gdbinit и добавляем туда gdbinit и gdb-v8-support.py . Эти файлы лежат в папке tools там где вы собрали v8

home/weaver/chrome/v8/tools

Выглядит у меня это так
Код:
nano ~/.gdbinit
source /home/weaver/pwndbg/gdbinit.py
source /home/weaver/chrome/v8/tools/gdbinit
source /home/weaver/chrome/v8/tools/gdb-v8-support.py

Покончив с настройкой отладчика можно приступать к отладке ;-)

p.s. Собственно кому надо тот разберется, как собрать js-движок v8, да и в интернете много заметок, как его собрать в том числе, как это сделать на Windows.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх