
Ghidra — это фреймворк для обратной разработки программного обеспечения (SRE).
Из корневой директории вашего релиза Ghidra выполните следующую команду:
./docker/build-docker-image.sh
Будет собран docker-образ ghidra с тегом, соответствующим версии релиза Ghidra.
Docker-контейнер Ghidra поддерживает следующие режимы (MODE) выполнения:
Переменная окружения MODE указывает, какую точку входа Ghidra следует выполнить.
Скрипт entrypoint.sh выполняется при запуске контейнера.
Настройка контейнера выполняется так же, как и любого другого docker-контейнера. Монтируются тома, задаются переменные окружения, пробрасываются порты из контейнера на хост и т.д. Шаги настройки сильно зависят от того, с каким режимом запускается контейнер.
Базовая директория для Ghidra внутри контейнера находится по пути /ghidra.
Все стандартные расположения файлов, конфигураций и т.д. Ghidra внутри этой директории остаются прежними.
Ghidra запускается от пользователя ghidra внутри контейнера, с uid 1001 и guid 1001.
Пользователь ghidra имеет права только на следующие директории внутри контейнера:
/ghidra/home/ghidraЕсли контейнеру не передаются никакие аргументы через команду docker run,
будет показана справка по использованию соответствующего интерфейса командной строки (CLI) для выбранного режима.
С томами внутри контейнера могут возникнуть проблемы с правами доступа, если они недоступны для пользователей с идентификатором группы 1001.
UID и GUID по умолчанию для контейнера — 1001:1001. Тома, которые отображаются в контейнер, должны быть доступны для этого uid/guid.
Добавление пользователя хост-машины в группу 1001 на хосте упрощает управление томами, которые будут использоваться в контейнере.
Это легко сделать, выполнив sudo usermod -aG 1001 <user> в Linux.
docker run \
--env MODE=headless \
--rm \
--volume /path/to/myproject:/home/ghidra/myproject \
--volume /path/to/mybinary:/home/ghidra/mybinary \
ghidra/ghidra:<version> \
/home/ghidra/myproject programFolder -import /home/ghidra/mybinary
Разберём эту команду построчно:
docker run запускает docker-контейнер с образом ghidra/ghidra<:<version>--env MODE=headless задаёт переменную окружения MODE внутри контейнера со значением headless--rm удаляет контейнер после завершения команды--volume /path/to/myproject:/home/ghidra/myproject монтирует локальный том
/path/to/myproject на хосте в /home/ghidra/myproject внутри контейнера--volume /path/to/mybinary:/home/ghidra/mybinary монтирует локальный том
/path/to/mybinary на хосте в /home/ghidra/mybinary внутри контейнераghidra/ghidra:<version> — полная ссылка на docker-образ, где — группа и имя образа, а — тег.Если не передавать аргументы, будет показана справка по безголовому анализатору.
/path/to/myproject на хосте должен быть доступен для guid 1001 с правами rwx.
Запуск графического интерфейса пользователя (GUI) Ghidra в docker-контейнере не рекомендуется. Графические интерфейсы не являются типичным вариантом использования для docker-изолированных приложений.
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
В этом режиме контейнер использует X11-forwarding для отображения графического интерфейса. Настройки X11 могут различаться, но в данном случае файл Xauthority хоста монтируется в контейнер, контейнер настроен на использование сети хоста, а переменная окружения DISPLAY передаётся контейнеру. Это позволяет перенаправить GUI обратно на дисплей хост-машины. Также потребуется смонтировать тома с бинарными файлами и проектами Ghidra.
Файл .Xauthority на хосте должен иметь соответствующие права — принадлежать группе :1001 с правами rw для группы.
docker run \
--env MODE=ghidra-server \
--rm \
-it \
--volume /path/to/my/repositories:/ghidra/repositories \
--volume /path/to/my/configs/server.conf:/ghidra/server/server.conf \
-p 13100:13100 \
-p 13101:13101 \
-p 13102:13102 \
ghidra/ghidra:<version>
Необходимо смонтировать тома в контейнер сервера, чтобы сохранять репозитории, пользователей и настроить сервер.
Для использования svrAdmin выполните вход в запущенный контейнер сервера ghidra с помощью docker exec -it <container-id> bash. После входа администрирование и управление сервером Ghidra выполняется так же, как и в среде без контейнера.
Для остановки контейнера выполните команду docker stop <container-id>.
ПРИМЕЧАНИЕ: порты, которые вы пробрасываете с хоста в docker-контейнер, должны совпадать. Вы можете изменить базовый порт сервера (например, 13100) в файле server.conf, используя опцию -p<port>.
docker run \
--env MODE=bsim-server \
--rm \
-it \
--volume /path/to/my/datadir:/ghidra/bsim_datadir \
-p 5432:5432 \
ghidra/ghidra:<version> \
/ghidra/bsim_datadir
/ghidra/bsim_datadir — это директория для хранения данных bsim в контейнере. Можно использовать и другие директории в контейнере,
но убедитесь, что папка на хост-машине имеет соответствующие права и принадлежит группе :1001.
Этот пример просто запускает сервер bsim. Настройка сервера bsim и наполнение его данными
может быть выполнена после запуска внутри контейнера аналогично администрированию сервера ghidra.
Администратору нужно выполнить вход в запущенный контейнер сервера bsim (docker exec -it <container-id> bash),
после чего администрирование и управление сервером Bsim выполняется так же, как и в среде без контейнера.
Для остановки контейнера выполните команду docker stop <container-id>.
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
В этом примере CLI bsim используется для подключения к серверу ghidra, размещённому на ghidrasvr,
генерации сигнатур для репозитория demo на этом сервере ghidra и сохранения их в /home/ghidra,
а затем отправки сигнатур на сервер BSIM, размещённый на bsimsvr, в базу данных demo.
Запуск графического интерфейса пользователя (GUI) Ghidra в docker-контейнере не рекомендуется. Графические интерфейсы не являются типичным вариантом использования для docker-изолированных приложений.
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
В этом режиме контейнер использует X11-forwarding для отображения графического интерфейса. Настройки X11 могут различаться, но в данном случае файл Xauthority хоста монтируется в контейнер, контейнер настроен на использование сети хоста, а переменная окружения DISPLAY передаётся контейнеру. Это позволяет перенаправить GUI обратно на дисплей хост-машины. Также потребуется смонтировать тома с бинарными файлами и проектами Ghidra.
Файл .Xauthority на хосте должен иметь соответствующие права — быть владельцем группы :1001 с правами rw для группы.
docker run \
--env MODE=pyghidra \
--rm \
--volume /path/to/myproject:/myproject \
--volume /path/to/mybinary:/mybinary \
ghidra/ghidra:<version> -H \
/myproject programFolder -import /mybinary
Если не передавать аргументы безголовому анализатору pyghidra, будет показано меню справки, так же, как и для безголового анализатора.
Этот вариант использования очень похож на пример безголового режима, но с дополнительным преимуществом — возможностью использовать python3 для скриптов Ghidra.
Опять же, в этом примере необходимы соответствующие права и назначение группы для /path/to/myproject и /path/to/mybinary,
чтобы избежать проблем с правами доступа.
ghidra/ghidra<version>/home/ghidra/myproject programFolder -import /home/ghidra/mybinary — аргументы, передаваемые интерфейсу командной строки безголового анализатора Ghidra