Hardware Hacking & Embedded Firmware RE

UART · JTAG/SWD · SPI Flash Dumping · Logic Analyzers · Bus Pirate · Ghidra · GDB · OpenOCD

Hardware Hacking Cover
Level 3 · Hardware Security & Reverse Engineering Master

Capítulo 1 · Reconocimiento de PCB & Análisis de Capa Física

El **Hardware Hacking** es la disciplina de auditar dispositivos embebidos e IoT mediante interacción directa con su placa de circuito impreso (PCB). A diferencia del pentesting de software tradicional, cuando se tiene acceso físico al dispositivo, las barreras lógicas pueden ser eludidas inspeccionando los componentes físicos y las señales electrónicas.

¿Qué es una PCB Teardown Auditoría?
Es la inspección sistemática de la arquitectura de la tarjeta de circuito: identificación de SoCs principales, memorias (NOR/NAND Flash, EEPROM, eMMC), controladores de energía (PMIC), cristal oscilador y puntos de prueba (Test Points / Pin Headers) para encontrar interfaces expuestas.
┌─────────────────────────────────────────────────────────────────────────────┐ │ ARQUITECTURA TÍPICA DE PLACA IOT / EDGE EMBEDDED │ │ │ │ [ Power Supply ] ──► [ PMIC Regulator ] ──► [ SoC / MCU ARM/MIPS/RISC-V ] │ │ │ │ │ │ │ └──► [ JTAG/SWD ] │ │ │ Pines Debug│ │ ▼ │ │ [ SPI NOR Flash / eMMC ] ◄─────────────── [ SPI / Bus UART ] │ │ (Almacena Firmware Boot/FS) (Consola Serie & Telemetría) │ └─────────────────────────────────────────────────────────────────────────────┘

Herramientas Esenciales del Laboratorio de Hardware Hacking

Herramienta HardwarePropósito PrincipalCasos de Uso Prácticos
Multímetro Digital & OsciloscopioMedición de voltajes, prueba de continuidad e inspección de reloj.Localizar masa (GND), VCC (3.3V/5V) y trazar pistas de datos ocultas.
Analizador Lógico (24MHz - 500MHz)Capturar señales lógicas de buses de datos y decodificar protocolos.Decodificar tráfico UART, SPI e I2C para descubrir baud rates y paquetes.
Bus Pirate v3.6 / v4 / v5Interfaz multipropósito para hablar directamente con chips integrados.Volcado de memorias SPI Flash de 8 pines (SOIC-8) sin desoldar.
JTAGulator / FT2232HDetección automática de patinajes y depuración JTAG/SWD.Identificar pines de depuración JTAG en PCBs sin serigrafía explícita.
Precaución con Niveles de Voltaje (Logic Levels): La mayoría de los SoCs modernos operan a 3.3V o 1.8V TTL. Conectar un adaptador USB-Serial de 5V RS232 directamente a los pines UART del microcontrolador puede quemar la CPU permanentemente. Utiliza siempre un conversor de nivel lógico o adaptadores USB-FTDI configurados a 3.3V/1.8V.
Cuestionario — Capítulo 1
1. Durante la inspección de una PCB desconocida, ¿cuál es el primer paso antes de alimentar la placa o conectar interfaces de datos?
En hardware hacking, identificar GND y VCC previene cortocircuitos y sobrevoltajes que podrían destruir el procesador o las memorias del dispositivo objetivo.

Capítulo 2 · Interfaces Serie (UART, SPI, I2C & JTAG/SWD)

Las tarjetas embebidas utilizan protocolos de comunicación serie para comunicarse internamente con periféricos y permitir el diagnóstico de fábrica durante la etapa de manufactura.

UART (Asíncrono)
Usa 2 líneas principales: TX (Transmit) y RX (Receive). Es la puerta de entrada a consolas U-Boot y Shells de Linux sin contraseña.
SPI (Síncrono Súper Rápido)
Usa 4 líneas: MISO, MOSI, CLK, CS. Utilizado para transferir firmware entre la memoria Flash y el SoC.
JTAG / SWD (Depuración)
Proporciona control total a nivel de registros de CPU, volcado de memoria RAM y pausa de ejecución en microcontroladores ARM/MIPS.

Captura y Análisis de Señales con PulseView & sigrok

Para determinar la velocidad de baudios (Baud Rate) de una línea UART desconocida (ej. 115200, 57600, 9600, 38400), conectamos los canales de un analizador lógico de $10 USD y ejecutamos sigrok-cli:

bash (sigrok UART Protocol Decoder)
# 1. Capturar 5 segundos de señal en el canal 0 a una tasa de muestreo de 12MHz
sigrok-cli --driver fx2lafw --config samplerate=12MHz --time 5s -o uart_capture.sr

# 2. Decodificar la señal UART capturada probando baudrate de 115200
sigrok-cli -i uart_capture.sr -P uart:baudrate=115200:rx=0 -B uart=ascii

# 3. Conectarse a la consola serie interactiva en Linux
picocom -b 115200 /dev/ttyUSB0
Cuestionario — Capítulo 2
1. ¿Qué diferencia principal existe entre la comunicación UART y SPI?
UART depende de que ambos dispositivos acuerden previamente la misma tasa de baudios (Baud Rate) ya que no transmite un reloj físico. SPI transmite la señal de reloj explícita por la línea CLK.

Capítulo 3 · Extracción de Firmware & SPI NOR Flash Dumping

Cuando la interfaz UART o los gestores de arranque están bloqueados con contraseña, el método más robusto para extraer el firmware completo es leer la memoria Flash directamente.

┌─────────────────────────────────────────────────────────────────────────────┐ │ CONEXIÓN CHIP-OFF / ISP SPI FLASH (SOIC-8) │ │ │ │ Pin 1 (/CS) ┌───┬───┐ Pin 8 (VCC 3.3V) │ │ Pin 2 (DO) │ o │ │ Pin 7 (/HOLD) ──► 3.3V │ │ Pin 3 (/WP) │ │ │ Pin 6 (CLK) ────────► Bus Pirate SPI CLK │ │ Pin 4 (GND) └───┴───┘ Pin 5 (DI) ────────► Bus Pirate SPI MOSI │ │ │ └─────────────────────────────────────────────────────────────────────────────┘

Extracción In-Circuit con `flashrom` y Bus Pirate

bash (SPI Flash Extraction)
# 1. Identificar el chip SPI conectado al Bus Pirate
sudo flashrom -p buspirate_spi:dev=/dev/ttyUSB0

# Salida esperada: Found Winbond flash chip "W25Q64.V" (8192 kB, SPI).

# 2. Volcar la memoria completa de 8MB a un archivo binario raw
sudo flashrom -p buspirate_spi:dev=/dev/ttyUSB0 -r firmware_dump.bin

# 3. Verificar la integridad realizando una segunda lectura y comparando hashes SHA256
sudo flashrom -p buspirate_spi:dev=/dev/ttyUSB0 -r firmware_dump2.bin
sha256sum firmware_dump.bin firmware_dump2.bin
Cuestionario — Capítulo 3
1. ¿Por qué es fundamental calcular y comparar los checksums SHA256 de dos volcados de memoria independientes del mismo chip?
Si la pinza de prueba SOIC-8 no hace buen contacto eléctrico en una patilla, el dump binario contendrá bytes erróneos (0xFF o 0x00). Si ambos hashes coinciden exactamente, el volcado es 100% fiel al hardware.

Capítulo 4 · Ingeniería Inversa de Firmware con Binwalk & Ghidra

Una vez obtenido el archivo firmware_dump.bin, el siguiente paso es extraer el sistema de archivos Linux (SquashFS / UBIFS) y descompilar los ejecutables de control en **Ghidra**.

bash (Binwalk Extractor)
# 1. Analizar firmas de compresión dentro del binario
binwalk firmware_dump.bin

# 2. Extraer automáticamente todos los sistemas de archivos detectados
binwalk -e --rm firmware_dump.bin

# 3. Navegar por el sistema de archivos raíz extraído
cd _firmware_dump.bin.extracted/squashfs-root
cat etc/shadow
grep -rn "password" etc/ scripts/

Descompilación de Binarios ELF con Ghidra

Al abrir ejecutables de servicio CGI en Ghidra (arquitecturas ARM v7 Little Endian o MIPS Big Endian), podemos localizar funciones vulnerables como system() o strcpy() invocadas sin validación de longitud de buffer.

c (Ghidra Decompiler View Preview)
/* Function: process_http_request (Vulnerable Code Identified in Ghidra) */
void process_http_request(char *user_input) {
    char cmd_buf[128];
    // VULNERABILIDAD CRÍTICA: Inyección de Comandos OS debido a sprintf insalubre
    sprintf(cmd_buf, "ping -c 1 '%s'", user_input);
    system(cmd_buf); // Se puede pasar "; telnetd -p 4444 -l /bin/sh #"
}
Cuestionario — Capítulo 4
1. ¿Qué información crucial suele encontrarse al extraer un archivo de sistema de archivos SquashFS de una cámara o router IoT?
Muchos dispositivos embebidos reutilizan contraseñas maestras de fábrica en el firmware o almacenan llaves criptográficas estáticas utilizadas para autenticar actualizaciones Over-The-Air (OTA).

Capítulo 5 · Depuración en Tiempo Real con JTAG, OpenOCD & GDB

JTAG (Joint Test Action Group) proporciona acceso de bajo nivel al procesador, permitiendo colocar breakpoints en la memoria Flash/RAM, volcar el estado del procesador y alterar variables de ejecución en caliente.

bash (OpenOCD & GDB Remote Debugging)
# 1. Iniciar servidor OpenOCD para un SoC ARM Cortex-M4 con interfaz ST-Link o J-Link
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg

# 2. Conectarse con GDB multiarquitectura (gdb-multiarch)
gdb-multiarch ./vulnerable_elf

# 3. Comandos interactivos de GDB para eludir validación de contraseña:
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) break check_admin_password
(gdb) continue
# Al detenerse en el breakpoint, forzar retorno de éxito (r0 = 1):
(gdb) set $r0 = 1
(gdb) continue
Cuestionario — Capítulo 5
1. En arquitecturas de 32 bits ARM (ARM32), ¿qué registro se utiliza típicamente para retornar el valor de éxito (0 o 1) de una función en C?
Según el estándar ARM Calling Convention (AAPCS), el registro R0 guarda el valor de retorno de las funciones. Al modificar $r0 = 1 en GDB, alteramos la decisión lógica del programa de forma instantánea.

Capítulo 6 · Laboratorio Interactivo Live: Hardware Signal & Firmware Dump Simulator

Utiliza esta terminal interactiva para simular el escaneo de puertos serie UART, la decodificación de ondas lógicas con analizador, el volcado SPI Flash y la extracción de secretos de firmware en vivo.

Interfaz de Hardware
FT2232H / USB-Serial
LISTO (3.3V TTL)
Chip Flash Detectado
Winbond W25Q128
Capacidad: 16 MB (SPI)
Firmware Target Architecture
ARM Cortex-A7 (32-bit)
Sustema de Archivos: SquashFS
[00:00.00][SYSTEM]Laboratorio de Hardware Hacking inicializado. Selecciona una acción arriba.
Evaluación Final del Curso
1. ¿Cuál es el orden recomendado en una auditoría profesional de seguridad en hardware IoT?
Seguir una metodología estructurada minimiza el riesgo de dañar físicamente el hardware original y garantiza que se mantenga una copia limpia de respaldo (dump original) del dispositivo.
Finalizar Curso