
Software de análisis de firmware binario en bruto
El propósito de este proyecto es analizar un firmware binario crudo y determinar automáticamente algunas de sus características. Esta herramienta es compatible con todas las arquitecturas, ya que básicamente, solo realiza estadísticas simples sobre él.
Características principales:
Primero, clona el repositorio git:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
Para compilar la última versión (solo linux):
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
Este comando debería dar una salida como esta:
[i] 32-bit architecture selected.
[i] File read (20480 bytes)
[i] Endianness is LE
[i] 6 strings indexed
[i] Found 3 base addresses to test
[i] Base address seems to be 0x60000000 (not sure)
More base addresses to consider (just in case):
0x005b5000 (0)
0x0bcd0000 (0)
En esta salida, la tercera línea muestra el endianness adivinado (LE, little-endian) y la sexta línea da la dirección adivinada (0x60000000). Se han identificado 6 cadenas de texto y 3 posibles direcciones base. Si no se especifica la arquitectura, se considera una arquitectura de 32 bits por defecto.
El valor entre paréntesis después de cada dirección candidata es la puntuación correspondiente. Cuanto mayor sea la puntuación, más probable es la dirección.
binbloom -a 64 firmware.bin
[i] 64-bit architecture selected.
[i] File read (327680 bytes)
[i] Endianness is LE
[i] 717 strings indexed
[i] Found 7535 base addresses to test
[i] Base address found: 0x0000000000010000.
More base addresses to consider (just in case):
0x000000000000e000 (276)
0x000000000000f000 (242)
0x0000000000011000 (175)
0x000000000000d000 (167)
0x000000000000b000 (121)
0x0000000000013000 (107)
0x0000000000012000 (100)
[...]
La opción -a le indica a binbloom que considere un firmware de 64 bits; la salida anterior muestra una dirección base adivinada de 0x10000.
Al tratar con firmwares pequeños (tamaño < 10 Kbytes), la detección de endianness de binbloom puede no ser fiable y dar un resultado
falso que lleve a direcciones base inesperadas. En este caso, puedes usar la opción -e para especificar el endianness:
binbloom -e be firmware.bin
Esto produce la siguiente salida:
[i] Selected big-endian architecture.
[i] File read (1048576 bytes)
[i] Endianness is BE
[i] 764 strings indexed
[i] Found 18615 base addresses to test
[i] Base address seems to be 0x00000000 (not sure).
More base addresses to consider (just in case):
0x3f740000 (121043)
0x7ff48000 (61345)
0x41140000 (59552)
[...]
El endianness se fuerza entonces (en este caso big-endian) y binbloom se basa en esta configuración para adivinar la dirección base.
binbloom -a 32 -e be -b 0x0 firmware.bin
[i] 32-bit architecture selected.
[i] Selected big-endian architecture.
[i] Base address 0x0000000000000000 provided.
[i] 764 strings indexed
Most probable UDS DB is located at @000ee8c8, found 7 different UDS RID
Identified structure:
struct {
code *p_field_0;
code *p_field_1;
uint32_t dw_2;
}
Este análisis se basa en heurísticas, por lo que puede dar falsos positivos. Debes leer la lista de posibles bases de datos UDS encontradas por binbloom y verificar cuál es la correcta, si es que hay alguna. Binbloom proporciona la estructura identificada en su salida, permitiendo a algunos desensambladores analizar la memoria siguiendo la declaración de la estructura.
Puedes acelerar el proceso de búsqueda de dirección base habilitando el multi-hilo con la opción -t. Por defecto, se usa un solo hilo.
binbloom -t 8 firmware.bin
También se implementa un modo de búsqueda profunda, habilitado con la opción -d, pero aún es experimental. Este modo puede ser útil en ocasiones muy raras, ya que puede
encontrar una dirección base válida cuando nada más funciona, pero es un modo más lento que puede tardar algún tiempo en completarse.
Si deseas que la herramienta muestre más información, usa una o más opciones -v.
binbloom se proporciona bajo la licencia Apache 2.0.