
Outil d'historique de firmware binaire uniquement qui apprend à localiser des fonctions dans des binaires bruts en extrayant des fonctions connues de binaires similaires, permettant une correspondance rapide des fonctions sans désassemblage pour l'analyse de firmware embarqué.
Polypyus apprend à localiser des fonctions dans des binaires bruts en extrayant des fonctions connues de binaires similaires. C'est donc un historien de firmware. Polypyus fonctionne sans désassembler ces binaires, ce qui est un avantage pour les binaires complexes à désassembler et pour lesquels les outils courants manquent des fonctions. De plus, l'approche binaire uniquement le rend très rapide et s'exécute en quelques secondes. Cependant, cette approche exige que les binaires soient de la même architecture et aient des options de compilateur similaires.
Polypyus s'intègre dans le flux de travail d'outils existants comme Ghidra, IDA, BinDiff et Diaphora. Par exemple, il peut importer des fonctions précédemment annotées et apprendre à partir de celles-ci, et également exporter les fonctions trouvées pour être importées dans IDA. Comme Polypyus utilise des seuils plutôt stricts, il n'a trouvé que des correspondances correctes dans nos expériences. Bien que cela conduise à moins de résultats que dans les outils existants, c'est un bon point de départ pour charger ces correspondances dans IDA afin d'améliorer ses résultats d'analyse automatique, puis d'exécuter BinDiff par-dessus.
Lors du travail sur des binaires de firmware bruts, notamment diverses versions de firmware Bluetooth Broadcom et Cypress, nous avons constaté que l'analyse automatique d'IDA identifiait souvent incorrectement les débuts de fonctions. Dans IDA Pro 6.8, l'analyse automatique est un peu plus agressive, ce qui donne plus de résultats mais aussi plus de faux positifs. Dans l'ensemble, IDA Pro 7.2 était plus pessimiste, mais manquait beaucoup de fonctions. Cela a conduit à seulement quelques correspondances BinDiff entre nos firmware dans IDA Pro 6.8 et à aucune correspondance utile dans IDA Pro 7.2.
Fait intéressant, BinDiff échouait souvent à identifier des fonctions qui, à l'exception des branches, étaient identiques octet par octet. Notez que Polypyus recherche exactement ces fonctions identiques octet par octet. Nous supposons que BinDiff échoue sur ces fonctions en raison d'un graphe d'appel différent produit par des fonctions manquantes et des faux positifs. Parfois, ces fonctions étaient déjà reconnues par IDA, mais souvent, IDA ne les reconnaissait pas comme du code ou ne les marquait pas comme fonction. Notez que Diaphora a des problèmes similaires, car il exporte les fonctions identifiées par IDA avant de les traiter plus avant. Ce qui suit montre un benchmark sur le binaire du firmware Bluetooth CYW20735B1 qui compare divers désassembleurs et comment les échecs du désassembleur entraînent des problèmes de différences en aval.
De plus, bien que nous ayons constaté qu'Amnesia trouve de nombreuses fonctions, il trouve aussi de nombreux faux positifs. Cependant, de nombreuses fonctions ont une configuration de cadre de pile similaire au début. Ainsi, Polypyus a une option pour apprendre les débuts de fonctions courants à partir des binaires d'entrée annotés et l'appliquer à d'autres binaires pour identifier des fonctions sans faire correspondre leur nom. Cette étape optionnelle n'est appliquée qu'aux régions dans lesquelles aucune fonction n'a été précédemment localisée, de cette façon la méthode des débuts de fonctions courants et la recherche principale de fonctions n'entrent pas en conflit.
Comme ces matchers travaillent sur le binaire brut, ils ne dépendent pas d'un désassembleur. Cela a aussi un inconvénient important : s'il y avait des options de compilateur différentes ou une architecture cible différente, Polypyus ne détectera pas de fonctions similaires. De plus, bien que les correspondances identifiées soient très fiables, l'identification du début de fonction est un peu moins fiable, donc utilisez cette dernière avec précaution. Dans ce qui suit, vous pouvez voir que les kits d'évaluation Cypress sont très similaires entre eux, mais que le firmware du MacBook est très différent.
Polypyus crée des matchers binaires flous en comparant des fonctions communes dans une collection de firmware binaires annotés.
Actuellement, les annotations suivantes sont prises en charge :
patch.elf WICED Studio, qui est un fichier ELF spécial contenant uniquement des définitions de symboles..symdefs tel que produit par la plupart des compilateurs ARM..csv avec un format documenté dans le dossier firmware.Ces annotations contiennent l'adresse, la taille et le nom des fonctions connues. Plus il y a de points communs entre les binaires d'entrée dans la collection d'historique, meilleures sont les performances et les résultats de Polypyus. Étant donné plusieurs fonctions légèrement différentes, Polypyus crée de très bons matchers.
Polypyus nécessite Python 3 >= 3.6. Nous conseillons d'utiliser un virtualenv pour l'installation suivante. Clonez ce dépôt et dans ce dossier exécutez :
pip install .
Après l'installation, les commandes suivantes sont disponibles :
polypyus-guipolypyus-cliPolypyus est disponible via une interface graphique et une interface en ligne de commande.
L'interface graphique polypyus-gui et la CLI polypyus-cli prennent toutes deux ces arguments lors de l'appel :
--verbose est le niveau de verbosité. Par défaut, il affiche les avertissements -v affiche les infos -vv affiche les informations de débogage.
--project définit l'emplacement du fichier de projet. Il s'agit soit d'un chemin de fichier, soit de ":memory:".
--help Affiche le message d'aide.
L'option de projet vous permet de stocker votre travail pour différents contextes dans différents fichiers et également de les rouvrir.
Le flux de travail général de l'interface graphique va du côté gauche de la fenêtre vers la droite.
D'abord, des binaires sont ajoutés à l'historique. Ensuite, des annotations de symboles pour les entrées
de l'historique sont ajoutées.
Après cela, des binaires cibles peuvent être ajoutés.
Pour la correspondance, cliquez sur Créer des matchers à partir de l'historique. Une fois les matchers créés, des cibles
individuelles peuvent être sélectionnées, ou toutes les cibles peuvent être mises en correspondance en sélectionnant batch match.
Enfin, les résultats peuvent être exportés dans un fichier .csv.
Dans la vidéo de démonstration ci-dessous, Polypyus ne prend que quelques secondes pour apprendre à partir de deux binaires d'entrée, les annoter, créer des matchers et appliquer les correspondances à un nouveau binaire.
L'avantage d'utiliser la CLI est sa capacité à être automatisée. Pour l'instant, le format de sortie de la CLI est susceptible de changer. Voici néanmoins un exemple d'appel :
polypyus-cli --history firmware/history/20819-A1.bin --annotation firmware/history/20819-A1_patch.elf --history firmware/history/20735B1.bin --annotation firmware/history/20735B1_patch.elf --project test.sqlite
polypyus-cli --target firmware/history/20739B1.bin --project test.sqlite