
ghidra Ghidra_12.1.3_build
Ghidra é um framework de engenharia reversa de software (SRE).
Ghidra Dockerizado
Construir
A partir do diretório raiz da sua versão do Ghidra, execute o seguinte comando.
./docker/build-docker-image.sh
Isto irá construir a imagem docker do Ghidra com uma tag correspondente à versão de lançamento do Ghidra.
A variável de ambiente MODE
O Container Docker do Ghidra suporta os seguintes MODE's de execução:
- gui
- headless
- ghidra-server
- bsim
- bsim-server
- pyghidra
A variável de ambiente MODE designa qual ponto de entrada do Ghidra deve ser executado.
O script entrypoint.sh é executado na inicialização do container.
Configurando um Container
A configuração de um container é feita da mesma forma que qualquer outro container docker seria configurado.
Volumes podem ser montados, variáveis de ambiente podem ser definidas, portas podem ser mapeadas do container para o host, e assim por diante.
As etapas de configuração variam muito dependendo do MODE com o qual o container é iniciado.
O diretório base para o Ghidra dentro do container está localizado em /ghidra.
Todos os locais padrão do Ghidra para arquivos, configurações, etc., são os mesmos dentro dele.
O Ghidra é executado como o usuário ghidra dentro do container, com uid 1001 e guid 1001.
O usuário ghidra tem permissões apenas para os seguintes diretórios dentro do container:
/ghidra/home/ghidra
Quando um container não recebe nenhum argumento passado a ele com o comando docker run,
a Interface de Linha de Comando (CLI) correspondente ao MODE executado exibirá sua declaração de uso.
Mapeando Volumes Locais para um Container
Volumes dentro do container podem encontrar problemas de permissão se os volumes não estiverem acessíveis por usuários no grupo id 1001.
O uid e guid padrão para o container é 1001:1001. Volumes que são mapeados para o container devem ser acessíveis por este uid/guid.
Adicionar o usuário da máquina host ao grupo 1001 no host ajuda a gerenciar volumes que serão usados no container.
Isso pode ser facilmente feito executando sudo usermod -aG 1001 <user> no Linux.
Exemplo do Modo Headless
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
Detalhando linha por linha:
docker runvai iniciar um container docker usando a imagemghidra/ghidra<:<version>--env MODE=headlessconfigura a variável de ambienteMODEdentro do container com o valorheadless--rmremove o container após o comando ser concluído--volume /path/to/myproject:/home/ghidra/myprojectmonta o volume local/path/to/myprojectno host para/home/ghidra/myprojectdentro do container--volume /path/to/mybinary:/home/ghidra/mybinarymonta o volume local/path/to/mybinaryno host para/home/ghidra/mybinarydentro do containerghidra/ghidra:<version>é a referência completa para a imagem docker, ondeghidra/ghidraé o grupo e nome da imagem, e<version>é a tag./home/ghidra/myproject programFolder -import /home/ghidra/mybinarysão argumentos passados para a interface de linha de comando do analisador headless do Ghidra
Passar nenhum argumento resultará na exibição do uso do analisador headless.
/path/to/myproject no host deve estar acessível ao guid 1001 com permissões rwx.
Exemplo do Modo Gui
Executar a Interface Gráfica do Usuário (GUI) do Ghidra no container docker não é um método recomendado para executar o Ghidra. GUIs não são um caso de uso típico para aplicações dockerizadas.
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
Neste modo, o container depende do encaminhamento X11 para exibir a GUI. A configuração do X11 pode variar, mas neste caso, o arquivo Xauthority do host é montado dentro do container, o container é configurado para usar a rede do host, e a variável de ambiente DISPLAY é passada para o container. Isso permite encaminhar a GUI de volta para o display da máquina host. Volumes contendo binários ainda precisariam ser montados no container, assim como volumes para projetos Ghidra.
O arquivo .Xauthority do host deve ter permissões apropriadas - atribuídas ao grupo :1001 com permissões de grupo rw.
Exemplo do Modo Ghidra Server
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>
Volumes precisariam ser montados no container do servidor para salvar os repositórios, usuários, e também para configurar o servidor.
Para utilizar o svrAdmin, execute um exec no container do servidor Ghidra em execução (docker exec -it <container-id> bash) para um shell bash no container.
Após fazer exec no container, a administração e gerenciamento do servidor Ghidra é a mesma que fora de um ambiente containerizado.
Para parar o container, execute o comando docker stop <container-id>.
NOTA: as portas que você mapeia do host para o container docker devem corresponder. Você pode alterar a porta base padrão do servidor (ex.: 13100) no arquivo server.conf usando a opção -p<port>.
Exemplo do Modo BSIM Server
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 é o diretório usado para armazenar os dados do bsim no container. Outros diretórios poderiam ser usados no container,
mas certifique-se de que a pasta na máquina host tenha permissões apropriadas, atribuídas ao grupo :1001.
Este exemplo simplesmente inicia um servidor bsim. Configurar o servidor bsim e populá-lo com dados
poderia ser feito após a inicialização dentro do container de forma semelhante à administração do servidor Ghidra.
Um administrador teria que executar exec no container do servidor bsim em execução (docker exec -it <container-id> bash),
e após fazer exec no container, a administração e gerenciamento do servidor Bsim é a mesma que fora de um ambiente containerizado.
Para parar o container, execute o comando docker stop <container-id>.
Exemplo do Modo CLI BSIM
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
Neste exemplo, a CLI bsim é usada para conectar a um servidor Ghidra hospedado em ghidrasvr,
gerar assinaturas para o repositório demo naquele servidor Ghidra e salvá-las em /home/ghidra.
e então confirmar as assinaturas no servidor BSIM hospedado em bsimsvr no banco de dados demo.
Exemplo do Modo Pyghidra Gui
Executar a Interface Gráfica do Usuário (GUI) do Ghidra no container docker não é um método recomendado para executar o Ghidra. GUIs não são um caso de uso típico para aplicações dockerizadas.
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
Neste modo, o container depende do encaminhamento X11 para exibir a GUI. A configuração do X11 pode variar, mas neste caso, o arquivo Xauthority do host é montado dentro do container, o container é configurado para usar a rede do host, e a variável de ambiente DISPLAY é passada para o container. Isso permite encaminhar a GUI de volta para o display da máquina host. Volumes contendo binários ainda precisariam ser montados no container, assim como volumes para projetos Ghidra.
O arquivo .Xauthority do host deve ter permissões apropriadas - pertencentes a :1001 com permissões de grupo rw.
Exemplo do Modo Pyghidra Headless
docker run \
--env MODE=pyghidra \
--rm \
--volume /path/to/myproject:/myproject \
--volume /path/to/mybinary:/mybinary \
ghidra/ghidra:<version> -H \
/myproject programFolder -import /mybinary
Passar nenhum argumento para o analisador headless pyghidra resultará na exibição do menu de ajuda, assim como o analisador headless.
Este caso de uso é muito semelhante ao exemplo do modo headless, com o benefício adicional de poder utilizar python3 para Scripts Ghidra.
Novamente, neste exemplo, permissões apropriadas e atribuição de grupo para /path/to/myproject e /path/to/mybinary são necessárias
para não encontrar problemas de permissão.