In questa lezione ci occuperemo dell'installazione e della configurazione di Ghidra, uno degli strumenti più potenti per il reverse engineering. Ghidra, sviluppato dalla National Security Agency (NSA) degli Stati Uniti e rilasciato come software open source, ci permette di analizzare software sospetti e individuare potenziali minacce malware. Per sfruttare al massimo il suo potenziale, dobbiamo prima installarlo correttamente e configurarci un ambiente di lavoro adeguato.
Requisiti di sistema e download
Prima di installare Ghidra, assicuriamoci che il nostro sistema soddisfi i seguenti requisiti minimi:
- Sistema operativo Windows, macOS o Linux.
- Java Development Kit (JDK) versione 11 o superiore.
- RAM almeno 4 GB (consigliati 8 GB o più per progetti complessi).
- Spazio su disco circa 500 MB per l'installazione base.
Per scaricare Ghidra, seguiamo questi passaggi:
- Visitiamo il sito ufficiale di Ghidra: https://ghidra-sre.org
- Clicchiamo su "Download Ghidra" e accettiamo i termini della licenza.
- Scarichiamo l'archivio ZIP contenente il software e lo estraiamo in una directory a nostra scelta.
Installazione di Java e configurazione dell’ambiente
Poiché Ghidra è scritto in Java, abbiamo bisogno di installare un JDK compatibile. Possiamo installarlo con i seguenti metodi:
Windows
- Scarichiamo il JDK da Adoptium o Oracle.
- Installiamo il JDK e aggiungiamo il percorso della cartella
bin
nelle variabili d’ambiente (se necessario). - Verifichiamo l'installazione aprendo il Prompt dei comandi ed eseguendo:
java -version
Linux/macOS
Su Linux possiamo installare OpenJDK direttamente dai repository ufficiali:
sudo apt install openjdk-11-jdk # Debian/Ubuntu
sudo dnf install java-11-openjdk # Fedora
Su macOS possiamo utilizzare Homebrew e il comando brew install openjdk@11
Dopo aver installato Java, assicuriamoci che sia configurato correttamente eseguendo java -version
nel terminale.
Avvio di Ghidra
Dopo aver estratto l’archivio ZIP di Ghidra:
- Su Windows navighiamo nella cartella estratta e facciamo doppio clic su
ghidraRun.bat
. - Su Linux/macOS apriamo il terminale e navighiamo nella cartella estratta, poi eseguiamo:
./ghidraRun
Se tutto è andato a buon fine, vedremo aprirsi l'interfaccia principale di Ghidra.
Creazione di un nuovo progetto
Per iniziare un'analisi con Ghidra dobbiamo creare un progetto:
- Clicchiamo su "File > New Project".
- Selezioniamo il tipo di progetto (per la maggior parte delle analisi, scegliamo "Non-Shared Project").
- Diamo un nome al progetto e scegliamo una directory di salvataggio.
- Clicchiamo su "Finish".
Ora siamo pronti per importare un file eseguibile da analizzare.
Importazione di un file eseguibile sospetto
Come eseguibile da importare abbiamo scelto un eseguibile di esempio disponibile su GitHub. Questo ci permetterà di familiarizzare con l'interfaccia e le funzionalità dello strumento.
- Scarichiamo l'eseguibile di esempio dal repository OliCyber.IT-Writeups. Il file si chiama
guesser_master
ed è un binario utilizzato in una challenge di reverse engineering. - Nella finestra principale di Ghidra, clicchiamo su "File > Import File".
- Selezioniamo il file
guesser_master
scaricato. Ghidra analizzerà automaticamente il file e suggerirà l'architettura corrispondente. - Confermiamo le impostazioni e clicchiamo su "OK".
Configurazione dell’ambiente di lavoro
Ora possiamo personalizzare Ghidra per facilitare l’analisi:
Preferenze generali
- Andiamo su "Edit > Tool Options" per modificare preferenze di visualizzazione e shortcut.
- Attiviamo la modalità scura (opzionale) per una migliore leggibilità.
Gestione dei plugin
Ghidra supporta vari plugin utili per il reverse engineering. Per gestirli:
- Clicchiamo su "File > Configure".
- Nella scheda "Extensions", possiamo installare nuovi plugin o disattivare quelli non necessari.
- Alcuni plugin utili includono:
- Decompiler Graphing per una migliore rappresentazione del flusso del codice.
- Debugger Integration per il debugging di programmi in esecuzione.
Setup degli script personalizzati
Uno dei punti di forza di Ghidra è la possibilità di usare script Python o Java per automatizzare analisi. Per configurare lo scripting:
- Apriamo il menu "Window > Script Manager".
- Qui possiamo caricare e scrivere script personalizzati.
- Ad esempio, uno script Python può essere utilizzato per identificare stringhe sospette nel malware:
from ghidra.program.model.address import AddressSet
from ghidra.program.model.listing import CodeUnit
from ghidra.util.task import ConsoleTaskMonitor
listing = currentProgram.getListing()
monitor = ConsoleTaskMonitor()
for codeUnit in listing.getCodeUnits(True):
if "http" in codeUnit.getComment(CodeUnit.EOL_COMMENT):
print("Possible C2 communication found at", codeUnit.getMinAddress())
Test dell'installazione con l'eseguibile di esempio
Ora che abbiamo importato l'eseguibile guesser_master
:
- Disassemblaggio: esaminiamo il codice assembly generato da Ghidra.
- Decompilazione: utilizziamo il decompilatore integrato per ottenere una rappresentazione in linguaggio C del codice.
- Mappatura delle funzioni: analizziamo la struttura del programma e le funzioni definite.
Questo ci aiuterà a familiarizzare con le funzionalità di Ghidra e le tecniche utilizzate per il reverse engineering. Adesso possiamo iniziare ad analizzarne la struttura. Un file eseguibile è composto da diverse sezioni, tra cui:
.text
– contiene il codice eseguibile..data
– contiene dati inizializzati utilizzati dal programma..bss
– contiene dati non inizializzati..rodata
– contiene dati in sola lettura, come stringhe di testo..plt
e.got
– tabelle utilizzate per la gestione delle funzioni dinamiche.
Possiamo esaminare queste sezioni in Ghidra utilizzando la vista "Program Trees" e "Symbol Tree", che ci permettono di identificare rapidamente il codice e i dati utilizzati dal programma.
Disassemblaggio
Il primo passo nell'analisi di un binario è il disassemblaggio del codice che converte il codice macchina in linguaggio assembly. In Ghidra, possiamo fare questo aprendo il file importato nel CodeBrowser e navigando attraverso le istruzioni assembly.
Alcuni aspetti chiave da osservare:
- le chiamate di funzione, spesso identificate con
CALL
seguite dall'indirizzo della funzione. - Il flusso del programma, con istruzioni come
JMP
,JZ
,JNZ
che indicano salti condizionali e incondizionati. - L'uso dello stack (
PUSH
,POP
) e dei registri (MOV
,XOR
,ADD
).
Ghidra include un potente decompilatore che tenta di ricostruire il codice in un linguaggio simile al C. Possiamo visualizzare la versione decompilata del codice selezionando una funzione e aprendo la scheda Decompiler.
Questa visualizzazione semplificata aiuta a capire meglio la logica del programma e facilita l'identificazione di eventuali comportamenti sospetti, come:
- lettura e scrittura su file.
- Connessioni di rete non documentate.
- Uso di funzioni crittografiche o tecniche di offuscamento.
Dopo aver decompilato il codice, possiamo cercare funzioni particolarmente rilevanti per comprendere il comportamento dell'eseguibile. Alcuni indicatori importanti:
- Funzioni di input/output –
fopen
,fwrite
,fread
,printf
che possono rivelare come il programma interagisce con i file. - Funzioni di rete –
socket
,connect
,send
,recv
che potrebbero indicare attività sospette di comunicazione con server remoti. - Uso della memoria –
malloc
,free
,memcpy
che possono rivelare possibili exploit di buffer overflow. - Evasione e offuscamento – funzioni che manipolano la memoria, come
VirtualAlloc
su Windows omprotect
su Linux, che potrebbero essere usate per nascondere codice malevolo.
Ghidra ci permette di esaminare queste funzioni utilizzando la vista "Function Graph" che mostra una rappresentazione visiva del flusso del programma e delle chiamate tra funzioni.
Conclusioni
In questa lezione abbiamo visto come installare e configurare Ghidra, oltre a esplorare le sue funzionalità di base per il reverse engineering di un eseguibile. Abbiamo importato un file di test, analizzato la sua struttura, disassemblato e decompilato il codice e identificato funzioni critiche. Questi passaggi sono fondamentali per comprendere il funzionamento di un software sconosciuto, soprattutto in ambito di sicurezza informatica e analisi malware.
Tuttavia, il lavoro di reverse engineering non si esaurisce qui: oltre alla configurazione dell’ambiente, è essenziale approfondire l’analisi statica per ottenere informazioni dettagliate sul comportamento di un codice binario senza eseguirlo. Nella prossima lezione, ci concentreremo proprio su questo aspetto: analizzeremo in dettaglio un codice binario tramite tecniche di analisi statica, esaminando le sue strutture interne, identificando le funzioni chiave e cercando eventuali indicatori di compromissione.
Questo ci permetterà di affinare ulteriormente le nostre competenze e di acquisire una maggiore comprensione dei metodi utilizzati nel reverse engineering.