
Analysesoftware für rohe Binär-Firmware
Der Zweck dieses Projekts ist es, eine rohe binäre Firmware zu analysieren und automatisch einige ihrer Eigenschaften zu bestimmen. Dieses Tool ist mit allen Architekturen kompatibel, da es im Grunde nur einfache Statistiken darüber erstellt.
Hauptfunktionen:
Klonen Sie zunächst das Git-Repository:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
Um die neueste Version zu bauen (nur Linux):
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
Dieser Befehl sollte eine Ausgabe wie diese erzeugen:
[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 dieser Ausgabe zeigt die dritte Zeile die erratene Endianness (LE, Little-Endian) und die sechste Zeile die erratene Adresse (0x60000000). Es wurden 6 Textstrings und 3 mögliche Basisadressen identifiziert. Wenn keine Architektur angegeben ist, wird standardmäßig eine 32-Bit-Architektur angenommen.
Der Wert in Klammern hinter jeder Kandidatenadresse ist die entsprechende Punktzahl. Je höher die Punktzahl, desto wahrscheinlicher ist die Adresse.
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)
[...]
Die Option -a teilt binbloom mit, eine 64-Bit-Firmware zu berücksichtigen. Die obige Ausgabe zeigt eine erratene Basisadresse von 0x10000.
Bei kleinen Firmwares (Größe < 10 KByte) kann die Endianness-Erkennung von binbloom unzuverlässig sein und ein falsches Ergebnis liefern, das zu unerwarteten Basisadressen führt. In diesem Fall können Sie die Option -e verwenden, um die Endianness anzugeben:
binbloom -e be firmware.bin
Es erzeugt dann die folgende Ausgabe:
[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)
[...]
Die Endianness wird dann erzwungen (in diesem Fall Big-Endian) und binbloom verlässt sich auf diese Konfiguration, um die Basisadresse zu erraten.
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;
}
Diese Analyse basiert auf Heuristiken, daher kann sie Fehlalarme liefern. Sie müssen die Liste der potenziellen UDS-Datenbanken lesen, die von binbloom gefunden wurden, und prüfen, welche die richtige ist, falls vorhanden. Binbloom liefert die identifizierte Struktur in seiner Ausgabe, sodass einige Disassembler den Speicher nach der Strukturdeklaration parsen können.
Sie können die Suche nach der Basisadresse beschleunigen, indem Sie Multithreading mit der Option -t aktivieren. Standardmäßig wird ein einzelner Thread verwendet.
binbloom -t 8 firmware.bin
Ein Tiefensuchmodus, aktiviert mit der Option -d, ist ebenfalls implementiert, aber noch experimentell. Dieser Modus kann in sehr seltenen Fällen nützlich sein, da er eine gültige Basisadresse finden kann, wenn nichts anderes funktioniert, aber er ist langsamer und kann einige Zeit in Anspruch nehmen.
Wenn das Tool mehr Informationen anzeigen soll, verwenden Sie eine oder mehrere -v Optionen.
binbloom wird unter der Apache 2.0 Lizenz bereitgestellt.