
Taller sobre ingeniería inversa de firmware
Este repositorio contiene las diapositivas y los materiales prácticos del taller de Emproof sobre ingeniería inversa de firmware, presentado en ScapyCon Automotive 2025. El taller está dirigido a un público técnico con experiencia mínima en seguridad y enseña los fundamentos mediante tareas prácticas y autocontenidas. Los temas incluyen
Si esto te interesa, echa también un vistazo a la serie de seminarios web técnicos de Emproof con ejercicios adicionales y sesiones grabadas.
El contenido del taller fue diseñado y organizado por Tim Blazytko, con el apoyo de Simran Kathpalia.
Para configurar el entorno, clona el repositorio:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
Para varias tareas necesitamos un entorno de ejecución Linux AArch64. Proporcionamos un contenedor Docker basado en Kali Linux con herramientas comunes (p. ej., GNU Binutils, Binwalk) preinstaladas. Esto unifica el entorno en Linux, Windows y macOS, independientemente de la arquitectura de la CPU del host. Para iniciar el contenedor y acceder a la shell, ejecuta:
./docker_run.sh
Nota: La primera ejecución puede tardar un rato en construir la imagen.
Nota (arquitectura): El servicio de Docker Compose establece
platform: "linux/arm64".
En hosts x86_64 (macOS/Windows/Linux Intel) Docker Desktop ejecutará la imagen mediante emulación, por lo que la primera compilación y el arranque pueden ser más lentos; es de esperar. En hosts ARM64 nativos (Apple Silicon, servidores ARM) se ejecuta de forma nativa y es más rápido.
Nota: El contenedor Docker también puede ejecutar binarios ARMv7 (armhf). Instalamos el runtime armhf (cargador dinámico + bibliotecas) en la imagen y registramos los manejadores binfmt tanto para
aarch64como paraarmmediante el script de inicio.
Además, instala las siguientes herramientas gráficas en tu host para las tareas interactivas de ingeniería inversa (no están incluidas en el contenedor):
Ambas herramientas están disponibles para Windows, Linux y macOS.
Nota: Binary Ninja Free no es compatible con AArch64. Para análisis AArch64 usa Ghidra (o una compilación con licencia de Binary Ninja). Por lo tanto, varios laboratorios incluyen un binario compañero ARMv7 (
*.armv7) específicamente para Binary Ninja Free; estos también se pueden ejecutar en el mismo contenedor.
Cada tarea es autocontenida en tasks/<name>/ e incluye:
samples/ — binarios (y a veces código fuente) utilizados en el ejerciciotask.md — el enunciado con instrucciones paso a paso y pistasLas tareas se pueden realizar de forma independiente, pero proporcionamos un orden recomendado (listado a continuación) que aumenta la dificultad e introduce nuevas técnicas gradualmente. La mayoría de las muestras están dirigidas a ARMv7 (Thumb/ARM32) o AArch64; cuando corresponde, las notas de la tarea indican la arquitectura, las herramientas necesarias y cualquier requisito especial de ejecución.
tasks/hello_world: conceptos básicos de los ficheros ELF y análisis de metadatos; primeros pasos en Ghidra / Binary Ninja.
tasks/license_check: extrae secretos hardcodeados / desbloquea funciones; parcheo básico para saltarse validaciones (cracking).
tasks/game: un sencillo juego de adivinar números; comprende la lógica y crackea el modo de prueba frente al modo completo.
tasks/keygenning_1: haz ingeniería inversa de una validación de licencia y escribe un keygen mínimo para generar seriales válidos.
tasks/keygenning_2: una tarea de keygenning ligeramente más sofisticada (sales/claves, codificación hexadecimal).
tasks/string_encryption: binario con cadenas cifradas (común en malware); identifica el descifrador y recupera las cadenas de forma estática.
tasks/mirai: malware embebido que utiliza una rutina de descifrado de cadenas; navega por una base de código más grande, identifica construcciones interesantes y trabaja con cadenas ofuscadas.
tasks/embedded_linux_1: firmware Linux embebido con sistema de ficheros; desempaqueta, explora y crackea la información de inicio de sesión de Linux (estilo CTF).
tasks/embedded_linux_2: similar, pero encuentra y analiza un binario oculto que no debería estar ahí.
tasks/car_demo: análisis de firmware bare-metal: identifica arquitectura, placa, mapa de memoria y artefactos de la cadena de herramientas; extrae credenciales Wi-Fi y endpoints del protocolo.
A menos que se indique lo contrario, todos los materiales del taller en este repositorio están licenciados bajo la GNU General Public License, versión 2 (GPL-2.0). Consulta LICENSE para ver el texto completo.
Algunas muestras de terceros / de fuentes externas están excluidas de la GPL y se proporcionan solo para análisis/educación (sin redistribución). Estas son:
Nota: Si un subdirectorio incluye su propio archivo o encabezado de licencia, esa licencia tiene prioridad sobre el contenido de ese subdirectorio.
tasks/iot_diag: volcado de firmware bare-metal de una herramienta de diagnóstico; recrea los diseños de memoria a partir de la hoja de datos y luego encuentra la contraseña para desbloquear el modo de diagnóstico.
tasks/crypto_detection: binario AArch64 que realiza operaciones criptográficas con una clave AES hardcodeada; localiza la llamada EVP y rastrea la clave/IV para descifrar sin el programa.
tasks/license_check_anti_patching: anti-parcheo mediante suma de comprobación del código; comprende la protección CRC y aprende formas de evadirla.
tasks/fibonacci_obfuscation: implementaciones de Fibonacci limpias vs. ofuscadas (switch flattening, computed goto, predicados opacos, ofuscación aritmética, pequeña VM); comprende las técnicas y normalízalas.