
Workshop di reverse engineering del firmware
Questo repository contiene slide e materiali pratici per il workshop di Emproof sul reverse engineering del firmware, presentato a ScapyCon Automotive 2025. Il workshop si rivolge a un pubblico tecnico con un'esperienza minima di sicurezza e insegna le basi attraverso attività pratiche e autonome. Gli argomenti includono
Se ti interessa, dai un'occhiata anche alla serie di webinar tecnici di Emproof con esercizi aggiuntivi e sessioni registrate.
Il contenuto del workshop è stato progettato e organizzato da Tim Blazytko, con il supporto di Simran Kathpalia.
Per configurare l'ambiente, clona il repository:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
Per diversi esercizi è richiesto un ambiente di esecuzione Linux AArch64. Forniamo un contenitore Docker basato su Kali Linux con strumenti comuni (ad es. GNU Binutils, Binwalk) preinstallati. Questo semplifica l'ambiente su Linux, Windows e macOS, indipendentemente dall'architettura della CPU host. Per avviare il contenitore e accedere alla shell, esegui:
./docker_run.sh
Nota: La prima esecuzione potrebbe richiedere del tempo per creare l'immagine.
Nota (architettura): Il servizio Docker Compose imposta
platform: "linux/arm64".
Su host x86_64 (Intel macOS/Windows/Linux) Docker Desktop eseguirà l'immagine tramite emulazione, quindi la prima build e l'avvio potrebbero essere più lenti — è normale. Su host ARM64 nativi (Apple Silicon, server ARM) viene eseguito nativamente ed è più veloce.
Nota: Il contenitore Docker può eseguire anche binari ARMv7 (armhf). Installiamo il runtime armhf (dynamic loader + librerie) nell'immagine e registriamo i gestori binfmt sia per
aarch64che perarmtramite lo script di avvio.
Inoltre, installa i seguenti strumenti grafici sul tuo host per le attività interattive di reverse engineering (non sono inclusi nel contenitore):
Entrambi gli strumenti sono disponibili per Windows, Linux e macOS.
Nota: Binary Ninja Free non supporta AArch64. Per l'analisi AArch64 usa Ghidra (o una build con licenza di Binary Ninja). Pertanto, diversi laboratori includono un binario compagno ARMv7 (
*.armv7) specificamente per Binary Ninja Free; questi possono essere eseguiti anche nello stesso contenitore.
Ogni esercizio è autonomo in tasks/<name>/ e include:
samples/ — i binari (e talvolta il sorgente) usati nell'eserciziotask.md — la consegna con istruzioni passo-passo e suggerimentiGli esercizi possono essere affrontati in modo indipendente, ma forniamo un ordine consigliato (elencato di seguito) che aumenta gradualmente la difficoltà e introduce nuove tecniche. La maggior parte dei campioni ha come target ARMv7 (Thumb/ARM32) o AArch64; dove rilevante, le note degli esercizi indicano l'architettura, gli strumenti richiesti e eventuali esigenze speciali di runtime.
tasks/hello_world: basi dei file ELF e analisi dei metadati; primi passi in Ghidra / Binary Ninja.
tasks/license_check: estrazione di segreti hardcoded / sblocco di funzionalità; patch di base per aggirare le validazioni (cracking).
tasks/game: semplice gioco di indovinare un numero; comprendere la logica e craccare la modalità trial rispetto a quella completa.
tasks/keygenning_1: fare reverse engineering di una validazione di licenza e scrivere un keygen minimale per generare seriali validi.
tasks/keygenning_2: un esercizio di keygenning leggermente più sofisticato (salt/chiavi, codifica hex).
tasks/string_encryption: binario con stringhe cifrate (comune nei malware); identificare il decryptor e recuperare le stringhe staticamente.
tasks/mirai: malware embedded che usa una routine di decrittazione delle stringhe; navigare in una codebase più grande, identificare costrutti interessanti e gestire stringhe offuscate.
tasks/embedded_linux_1: firmware embedded-Linux con filesystem; estrarre, esplorare e craccare le informazioni di login Linux (stile CTF).
tasks/embedded_linux_2: simile, ma trovare e analizzare un binario nascosto che non dovrebbe essere lì.
tasks/car_demo: analisi di firmware bare-metal: identificare architettura, scheda, mappa di memoria, artefatti del toolchain; estrarre credenziali Wi-Fi e endpoint di protocollo.
Salvo diversa indicazione, tutti i materiali del workshop in questo repository sono concessi in licenza secondo la GNU General Public License, versione 2 (GPL-2.0). Vedi LICENSE per il testo completo.
Alcuni campioni di terze parti / provenienti da fonti esterne sono esclusi dalla GPL e forniti solo per analisi/istruzione (nessuna ridistribuzione). Questi sono:
Nota: Se una sottodirectory include un proprio file di licenza o header, quella licenza ha precedenza per il contenuto di quella sottodirectory.
tasks/iot_diag: dump di firmware bare-metal di uno strumento diagnostico; ricreare i layout di memoria dal datasheet, poi trovare la password per sbloccare la modalità diagnostica.
tasks/crypto_detection: binario AArch64 che esegue operazioni crittografiche con una chiave AES hardcoded; individuare la chiamata EVP e risalire a chiave/IV per decrittare senza il programma.
tasks/license_check_anti_patching: anti-patching tramite checksum del codice; comprendere il controllo CRC e imparare modi per aggirarlo.
tasks/fibonacci_obfuscation: implementazioni di Fibonacci pulite vs offuscate (switch flattening, computed goto, predicati opachi, offuscamento aritmetico, piccola VM); comprendere le tecniche e normalizzarle.