Le but de ce projet est d'analyser un micrologiciel binaire brut et de déterminer automatiquement certaines de ses fonctionnalités. Cet outil est compatible avec toutes les architectures comme fondamentalement, il fait simplement des statistiques simples.
Caractéristiques principales:
Tout d'abord, clonez le référentiel GIT:
git clone https://github.com/quarkslab/binbloom.git
cd binbloomPour créer la dernière version (Linux uniquement):
autoreconf -i
./configure
make
sudo make install binbloom firmware.binCette commande devrait donner une sortie comme ceci:
[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)Dans cette sortie, la troisième ligne affiche la Endianness devinée ( LE , Little-Endian) et la sixième ligne donne l'adresse devinée ( 0x60000000 ). 6 chaînes de texte et 3 adresses de base possibles ont été identifiées. Si l'architecture n'est pas spécifiée, l'architecture 32 bits est considérée par défaut.
La valeur entre parenthèses après chaque adresse candidate est le score correspondant. Plus le score est élevé, plus l'adresse est probable.
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'option -a indique à Binbloom de considérer un firmware 64 bits, la sortie ci-dessus montre une adresse de base devinée de 0x10000.
Lorsque vous traitez avec les petites firmwares (taille <10 kilomètres), la détection de l'endeurness Binbloom peut ne pas être fiable et donner un faux résultat qui conduit à des adresses de base inattendues. Dans ce cas, vous pouvez utiliser l'option -e pour spécifier la Endianness:
binbloom -e be firmware.binIl produit ensuite la sortie suivante:
[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 est ensuite forcé (dans ce cas, Big-Endian) et Binbloom s'appuie sur cette configuration pour deviner l'adresse de 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;
}Cette analyse est basée sur l'heuristique afin qu'elle puisse donner de faux positifs. Vous devez lire la liste des bases de données UDS potentielles trouvées par binbloom et vérifier et voir laquelle est la bonne, le cas échéant. Binbloom fournit la structure identifiée dans sa sortie, permettant à certains démonts d'analyser la mémoire après la déclaration de structure.
Vous pouvez accélérer le processus de recherche d'adresse de base en activant le multi-lancement avec l'option -t . Par défaut, un seul thread est utilisé.
binbloom -t 8 firmware.bin Un mode de recherche en profondeur , activé avec l'option -d , est également implémenté mais est toujours expérimental. Ce mode peut être utile dans des occasions très rares car elle peut trouver une adresse de base valide lorsque rien d'autre ne fonctionne, mais c'est un mode plus lent qui peut prendre un certain temps à terminer.
Si vous souhaitez que l'outil affiche plus d'informations, utilisez une ou plusieurs options -v .
Binbloom est fourni sous la licence Apache 2.0.