El propósito de este proyecto es analizar un firmware binario sin procesar y determinar automáticamente algunas de sus características. Esta herramienta es compatible con todas las arquitecturas, como básicamente, solo hace estadísticas simples al respecto.
Características principales:
Primero, clona el repositorio de git:
git clone https://github.com/quarkslab/binbloom.git
cd binbloomPara construir la última versión (solo Linux):
autoreconf -i
./configure
make
sudo make install binbloom firmware.binEste comando debe 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 la endianness adivinada ( LE , Little-endian) y la sexta línea proporciona la dirección adivinada ( 0x60000000 ). Se han identificado 6 cadenas de texto y 3 posibles direcciones base. Si no se especifica la arquitectura, la arquitectura de 32 bits se considera por defecto.
El valor entre paréntesis después de cada dirección candidata es el puntaje correspondiente. Cuanto mayor sea el puntaje, 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 dice a BinBloom que considere un firmware de 64 bits, la salida anterior muestra una dirección base adivinada de 0x10000.
Cuando se trata de pequeños firmas de firmas (tamaño <10 kbytes), la detección de endianness endianness puede no ser confiable y dar un resultado falso que conduce a direcciones base inesperadas. En este caso, puede usar la opción -e para especificar la endianness:
binbloom -e be firmware.binLuego 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)
[...]Endianness se forja (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 la heurística, por lo que puede dar falsos positivos. Debe leer la lista de posibles bases de datos UDS encontradas por Binbloom y verificar y ver cuál es la correcta, si las hay. Binbloom proporciona la estructura identificada en su salida, lo que permite a algunos desestimadores analizar la memoria después de la declaración de la estructura.
Puede acelerar el proceso de búsqueda de direcciones base habilitando múltiples subprocesos 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 , habilitarse con la opción -d , pero sigue siendo 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 desea que la herramienta muestre más información, use una o más opciones -v .
Binbloom se proporciona bajo la licencia Apache 2.0.