
Workshop on firmware reverse engineering
Este repositório contém slides e materiais práticos para o workshop da Emproof sobre engenharia reversa de firmware, apresentado no ScapyCon Automotive 2025. O workshop é direcionado a um público técnico com experiência mínima em segurança e ensina os fundamentos por meio de tarefas práticas e autocontidas. Os tópicos incluem
Se isso é do seu interesse, confira também a série de webinars técnicos da Emproof com exercícios adicionais e sessões gravadas.
O conteúdo do workshop foi projetado e organizado por Tim Blazytko, com apoio de Simran Kathpalia.
Para configurar o ambiente, clone o repositório:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
Para várias tarefas, precisamos de um ambiente de execução Linux AArch64. Fornecemos um contêiner Docker baseado no Kali Linux com ferramentas comuns (por exemplo, GNU Binutils, Binwalk) pré-instaladas. Isso simplifica o ambiente em Linux, Windows e macOS — independentemente da arquitetura da CPU do host. Para iniciar o contêiner e entrar no shell, execute:
./docker_run.sh
Nota: A primeira execução pode demorar um pouco para construir a imagem.
Nota (arquitetura): O serviço Docker Compose define
platform: "linux/arm64".
Em hosts x86_64 (Intel macOS/Windows/Linux), o Docker Desktop executará a imagem sob emulação, então a primeira construção e inicialização podem ser mais lentas — isso é esperado. Em hosts ARM64 nativos (Apple Silicon, servidores ARM), ele é executado nativamente e é mais rápido.
Nota: O contêiner Docker também pode executar binários ARMv7 (armhf). Instalamos o runtime armhf (dynamic loader + libs) na imagem e registramos manipuladores binfmt para
aarch64earmatravés do script de inicialização.
Além disso, instale as seguintes ferramentas gráficas no seu host para tarefas interativas de engenharia reversa (elas não estão incluídas no contêiner):
Ambas as ferramentas estão disponíveis para Windows, Linux e macOS.
Nota: O Binary Ninja Free não suporta AArch64. Para análise AArch64, use Ghidra (ou uma versão licenciada do Binary Ninja). Portanto, vários laboratórios incluem um binário companheiro ARMv7 (
*.armv7) especificamente para o Binary Ninja Free; eles também podem ser executados no mesmo contêiner.
Cada tarefa é autocontida em tasks/<nome>/ e inclui:
samples/ — binários (e às vezes código-fonte) usados no exercíciotask.md — a tarefa com instruções passo a passo e dicasAs tarefas podem ser realizadas de forma independente, mas fornecemos uma ordem recomendada (listada abaixo) que aumenta a dificuldade e introduz gradualmente novas técnicas. A maioria das amostras tem como alvo ARMv7 (Thumb/ARM32) ou AArch64; quando relevante, as anotações da tarefa indicam a arquitetura, as ferramentas necessárias e quaisquer necessidades especiais de tempo de execução.
tasks/hello_world: fundamentos de arquivos ELF e análise de metadados; primeiros passos no Ghidra / Binary Ninja.
tasks/license_check: extrair segredos codificados / desbloquear recursos; patching básico para contornar validações (cracking).
tasks/game: jogo simples de adivinhação de números; entender a lógica e quebrar o modo trial vs. completo.
tasks/keygenning_1: reverter uma validação de licença e escrever um keygen mínimo para gerar seriais válidos.
tasks/keygenning_2: uma tarefa de keygenning um pouco mais sofisticada (salts/keys, codificação hexadecimal).
tasks/string_encryption: binário com strings criptografadas (comum em malware); identificar o decriptador e recuperar strings estaticamente.
tasks/mirai: malware embarcado usando uma rotina de descriptografia de strings; navegar por uma base de código maior, identificar construções interessantes e lidar com strings ofuscadas.
tasks/embedded_linux_1: firmware Linux embarcado com sistema de arquivos; desempacotar, explorar e quebrar informações de login do Linux (estilo CTF).
tasks/embedded_linux_2: similar, mas encontrar e analisar um binário oculto que não deveria estar lá.
tasks/car_demo: análise de firmware bare-metal: identificar arquitetura, placa, mapa de memória, artefatos da toolchain; extrair credenciais Wi-Fi e endpoints de protocolo.
Salvo indicação em contrário, todos os materiais do workshop neste repositório estão licenciados sob a GNU General Public License, versão 2 (GPL-2.0). Consulte LICENSE para o texto completo.
Algumas amostras de terceiros / de fontes externas são excluídas da GPL e fornecidas apenas para análise/educação (sem redistribuição). Estas são:
Nota: Se um subdiretório incluir seu próprio arquivo de licença ou cabeçalho, essa licença terá precedência para o conteúdo desse subdiretório.
tasks/iot_diag: dump de firmware bare-metal de uma ferramenta de diagnóstico; recriar layouts de memória a partir da folha de dados e encontrar a senha para desbloquear o modo de diagnóstico.
tasks/crypto_detection: binário AArch64 realizando operações criptográficas com uma chave AES codificada; localizar a chamada EVP e rastrear chave/IV para decriptar sem o programa.
tasks/license_check_anti_patching: antipatching via soma de verificação de código; entender a proteção CRC e aprender maneiras de contorná-la.
tasks/fibonacci_obfuscation: implementações Fibonacci limpas vs. ofuscadas (switch flattening, computed goto, predicados opacos, ofuscação aritmética, pequena VM); entender técnicas e normalizá-las.