
Ghidra è un framework di reverse engineering del software (SRE)
Dalla directory principale della tua release di Ghidra, esegui il comando seguente.
./docker/build-docker-image.sh
Questo creerà l'immagine docker di ghidra con un tag corrispondente alla versione di release di Ghidra.
Il container Docker di Ghidra supporta le seguenti modalità di esecuzione MODE:
La variabile d'ambiente MODE designa quale punto di ingresso di Ghidra eseguire.
Lo script entrypoint.sh viene eseguito all'avvio del container.
La configurazione di un container viene effettuata come qualsiasi altro container docker. I volumi possono essere montati, le variabili d'ambiente possono essere impostate, le porte possono essere mappate dal container all'host e così via. I passaggi di configurazione variano molto in base alla MODALITÀ con cui viene avviato il container.
La directory base per Ghidra all'interno del container si trova in /ghidra.
Tutte le posizioni predefinite di ghidra per file, configurazioni, ecc., sono le stesse all'interno di essa.
Ghidra viene eseguito come utente ghidra all'interno del container, con uid 1001 e guid 1001.
L'utente ghidra ha solo i permessi per le seguenti directory all'interno del container:
/ghidra/home/ghidraQuando un container non riceve argomenti passati con il comando docker run, la corrispondente interfaccia a riga di comando (CLI) per la MODE eseguita visualizzerà il suo messaggio di utilizzo.
I volumi all'interno del container potrebbero incontrare problemi di permessi se i volumi non sono accessibili dagli utenti del gruppo id 1001.
L'uid e guid predefiniti per il container sono 1001:1001.
I volumi che vengono mappati al container dovrebbero essere accessibili da questo uid/guid.
Aggiungere l'utente della macchina host al gruppo 1001 sull'host aiuta a gestire i volumi che verranno utilizzati nel container.
Questo può essere facilmente fatto eseguendo sudo usermod -aG 1001 <user> su 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
Analizzando questo comando riga per riga:
docker run avvierà un container docker usando l'immagine ghidra/ghidra<:<version>--env MODE=headless configura la variabile d'ambiente MODE all'interno del container al valore headless--rm rimuove il container dopo il completamento del comando--volume /path/to/myproject:/home/ghidra/myproject monta il volume locale /path/to/myproject sull'host in /home/ghidra/myproject all'interno del container--volume /path/to/mybinary:/home/ghidra/mybinary monta il volume locale /path/to/mybinary sull'host in /home/ghidra/mybinary all'interno del containerghidra/ghidra:<version> è il riferimento completo per l'immagine docker, dove è il gruppo e il nome dell'immagine, e è il tag.Non passare argomenti comporterà la visualizzazione dell'utilizzo dell'analizzatore headless.
/path/to/myproject sull'host deve essere accessibile al guid 1001 con permessi rwx.
Eseguire l'interfaccia grafica utente (GUI) di Ghidra nel container docker non è un metodo raccomandato per eseguire Ghidra. Le GUI non sono un caso d'uso tipico per applicazioni dockerizzate.
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
In questa modalità, il container si basa sul forwarding X11 per visualizzare la GUI. La configurazione di X11 può variare, ma in questo caso, il file Xauthority dell'host viene montato nel container, il container è configurato per utilizzare la rete dell'host, e la variabile d'ambiente DISPLAY viene passata al container. Ciò consente di reindirizzare la GUI al display della macchina host. I volumi contenenti binari dovrebbero comunque essere montati nel container, così come i volumi per i progetti ghidra.
Il file .Xauthority dell'host deve avere i permessi appropriati - assegnati al gruppo :1001 con permessi di gruppo 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>
I volumi dovrebbero essere montati nel container del server per salvare i repository, gli utenti e anche per configurare il server.
Per utilizzare svrAdmin, esegui exec nel container del server ghidra in esecuzione (docker exec -it <container-id> bash) per una shell bash nel container. Dopo aver eseguito exec nel container, l'amministrazione e la gestione del server Ghidra sono le stesse di un ambiente non containerizzato.
Per fermare il container, esegui il comando docker stop <container-id>.
NOTA: le porte che mappi dall'host al container docker devono corrispondere. Puoi cambiare la porta base del server predefinita (es. 13100) nel file server.conf usando l'opzione -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 è la directory utilizzata per memorizzare i dati di bsim nel container. Altre directory potrebbero essere usate sul container, ma assicurati che la cartella sulla macchina host abbia i permessi appropriati, assegnati al gruppo :1001.
Questo esempio avvia semplicemente un server bsim. Configurare il server bsim e popolarlo con dati potrebbe essere fatto dopo l'avvio all'interno del container in modo simile a come viene fatta l'amministrazione del server ghidra. Un amministratore dovrebbe eseguire exec nel container del server bsim in esecuzione (docker exec -it <container-id> bash), e dopo aver eseguito exec nel container, l'amministrazione e la gestione del server Bsim sono le stesse di un ambiente non containerizzato.
Per fermare il container, esegui il comando 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
In questo esempio, la CLI bsim viene utilizzata per connettersi a un server ghidra ospitato su ghidrasvr, generare firme per il repository demo in quel server ghidra e salvarle in /home/ghidra, e poi inviare le firme al server BSIM ospitato su bsimsvr nel database demo.
Eseguire l'interfaccia grafica utente (GUI) di Ghidra nel container docker non è un metodo raccomandato per eseguire Ghidra. Le GUI non sono un caso d'uso tipico per applicazioni dockerizzate.
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
In questa modalità, il container si basa sul forwarding X11 per visualizzare la GUI. La configurazione di X11 può variare, ma in questo caso, il file Xauthority dell'host viene montato nel container, il container è configurato per utilizzare la rete dell'host, e la variabile d'ambiente DISPLAY viene passata al container. Ciò consente di reindirizzare la GUI al display della macchina host. I volumi contenenti binari dovrebbero comunque essere montati nel container, così come i volumi per i progetti ghidra.
Il file .Xauthority dell'host deve avere i permessi appropriati - di proprietà di :1001 con permessi di gruppo 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
Non passare argomenti all'analizzatore headless pyghidra comporterà la visualizzazione del menu di aiuto, proprio come per l'analizzatore headless.
Questo caso d'uso è molto simile all'esempio della modalità headless con il vantaggio aggiuntivo di poter utilizzare python3 per gli script di Ghidra.
Ancora, in questo esempio, permessi appropriati e assegnazione del gruppo per /path/to/myproject e /path/to/mybinary sono necessari per non incontrare problemi di permessi.
ghidra/ghidra<version>/home/ghidra/myproject programFolder -import /home/ghidra/mybinary sono argomenti passati all'interfaccia a riga di comando dell'analizzatore headless di Ghidra