
Software di analisi del firmware binario grezzo
Lo scopo di questo progetto è analizzare un firmware binario grezzo e determinare automaticamente alcune delle sue caratteristiche. Questo strumento è compatibile con tutte le architetture poiché, fondamentalmente, esegue semplici statistiche su di esso.
Caratteristiche principali:
Per prima cosa, clona il repository git:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
Per compilare l’ultima versione (solo linux):
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
Questo comando dovrebbe produrre un output simile a questo:
[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)
In questo output, la terza riga mostra l’endianness ipotizzata (LE, little-endian) e la sesta riga fornisce l’indirizzo ipotizzato (0x60000000). Sono state identificate 6 stringhe di testo e 3 possibili indirizzi di base. Se l’architettura non è specificata, per impostazione predefinita viene considerata l’architettura a 32 bit.
Il valore tra parentesi dopo ogni indirizzo candidato è il punteggio corrispondente. Più alto è il punteggio, più probabile è l’indirizzo.
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)
[...]
L’opzione -a dice a binbloom di considerare un firmware a 64 bit; l’output sopra mostra un indirizzo di base ipotizzato di 0x10000.
Quando si ha a che fare con firmware di piccole dimensioni (dimensioni < 10 Kbyte), il rilevamento dell’endianness di binbloom potrebbe non essere affidabile e fornire un risultato falso che porta a indirizzi di base inaspettati. In questo caso, puoi utilizzare l’opzione -e per specificare l’endianness:
binbloom -e be firmware.bin
Successivamente produce il seguente output:
[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)
[...]
L’endianness viene quindi forzata (in questo caso big-endian) e binbloom si basa su questa configurazione per indovinare l’indirizzo di 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;
}
Questa analisi si basa su euristiche, quindi può dare falsi positivi. Devi leggere l’elenco dei potenziali database UDS trovati da binbloom e verificare quale sia quello corretto, se presente. Binbloom fornisce la struttura identificata nel suo output, consentendo ad alcuni disassemblatori di analizzare la memoria che segue la dichiarazione della struttura.
Puoi accelerare il processo di ricerca dell’indirizzo di base abilitando il multi-threading con l’opzione -t. Per impostazione predefinita, viene utilizzato un singolo thread.
binbloom -t 8 firmware.bin
È implementata anche una modalità di ricerca approfondita, abilitata con l’opzione -d, ma è ancora sperimentale. Questa modalità può essere utile in occasioni molto rare, poiché può trovare un indirizzo di base valido quando nient’altro funziona, ma è una modalità più lenta che potrebbe richiedere del tempo per completarsi.
Se desideri che lo strumento mostri più informazioni, utilizza una o più opzioni -v.
binbloom è fornito sotto licenza Apache 2.0.