
Logiciel d'analyse de firmware binaire brut
Le but de ce projet est d'analyser un firmware binaire brut et de déterminer automatiquement certaines de ses fonctionnalités. Cet outil est compatible avec toutes les architectures car, fondamentalement, il effectue simplement des statistiques simples sur celui-ci.
Fonctionnalités principales :
D'abord, clonez le dépôt git :
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
Pour construire la dernière version (linux uniquement) :
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
Cette commande devrait donner une sortie comme celle-ci :
[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 l'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.
Lorsqu'il s'agit de petits firmwares (taille < 10 Ko), la détection de l'endianness par binbloom peut ne pas être fiable et donner un résultat erroné conduisant à des adresses de base inattendues. Dans ce cas, vous pouvez utiliser l'option -e pour spécifier l'endianness :
binbloom -e be firmware.bin
Il produit alors 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)
[...]
L'endianness est alors forcée (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 des heuristiques, elle peut donc donner des faux positifs. Vous devez lire la liste des bases de données UDS potentielles trouvées par binbloom et vérifier laquelle est la bonne, si elle existe. Binbloom fournit la structure identifiée dans sa sortie, permettant à certains désassembleurs d'analyser la mémoire suivant la déclaration de la structure.
Vous pouvez accélérer le processus de recherche d'adresse de base en activant le multi-threading avec l'option -t. Par défaut, un seul thread est utilisé.
binbloom -t 8 firmware.bin
Un mode de recherche approfondie, activé avec l'option -d, est également implémenté mais reste expérimental. Ce mode peut être utile dans de très rares occasions car il peut trouver une adresse de base valide lorsque rien d'autre ne fonctionne, mais c'est un mode plus lent qui peut prendre du temps à s'exécuter.
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.