Vous est-il déjà arrivé de vous demander quelles sont les modifications lors d’une mise à jour d’un firmware ou d’une application fermée ? Quelles fonctionnalités ont été implémentées ? Quelle faille a été corrigée ? Comment a-t-elle été corrigée ? Moi, oui.


Les constructeurs et fabricants de mobiles, objets connectés et routeurs prennent maintenant au sérieux les différentes failles de sécurités reportées par les chercheurs en sécurités et hackers.

Dans ce post je vais expliquer comment faire du bindiffing sur des applications ou firmwares.

Binary Diffing

Le Binary Diffing ou Bindiffing est une méthode qui consiste à comparer des fichiers binaires pour y trouver des différences. Cette technique est surtout utilisée pour comparer deux fichiers, l’un comprenant une faille de sécurité, l’autre ayant un patch pour corriger cette faille.

Je prend l’exemple de la faille de sécurité, mais ça marche aussi pour la mise en place d’une nouvelle fonctionnalité lors d’une mise à jour, on ne reste pas que le monde de la sécurité.

De plus lorsque le code source n’est pas accessible au public, c’est l’unique moyen de comprendre comment un patch a été appliqué pour mieux comprendre la vulnérabilité.

En effet, la plupart du temps lorsque des failles sont corrigées, très peu d’informations sont fournies dans les bulletins de sécurité. Il est donc difficile de comprendre comment une faille est corrigée ou comment s’entrainer à l’exploiter.

On peut voir un exemple concret avec la liste des correctifs de sécurité d’iOS 11.2 qui divulgue peu d’informations.

wat

Il est toujours possible de différentier des binaires simples avec vimdiff comme ceci :

$ xxd initial > initial.hex
$ xxd improved > improved.hex
$ vimdiff initial.hex improved.hex

On obtient ce résultat :

wat

Une fenêtre vim séparée en deux ou les différences sont surlignées en rouge et les lignes avec des différences en rouge. Vous trouvez ça simple ? Ok. Maintenant imaginez des projets avec des milliers de lignes de code.

Diaphora

C’est là qu’intervient Diaphora qui est un projet open source écrit en Python qui permet de faire du bindiffing avec IDA Pro.

Pour expliquer comment cet outil fonctionne je vais utiliser un des bootloaders d’iOS et de l’iPhone : l’iBoot. Si vous souhaitez vous renseigner sur l’iBoot je vous invite à voir mon post sur la séquence de démarrage d’iOS.

Setup

J’ai téléchargé deux versions d’iOS avec des changements significatifs : iOS 10.3.3 et iOS 11.0. J’ai extrait l’iBoot de chaque firmware

$ unzip -p iPhone_4.0_64bit_11.0_15A372_Restore.ipsw Firmware/all_flash/iBoot.iphone6.RELEASE.im4p > iBoot.iPhone5S.11.im4p

Puis je les ai déchiffré à l’aide d’img4lib comme ceci :

$ img4 -i iBoot.iPhone5S.11.im4p iBoot.iPhone5S.11.im4p.dec b496305090ef906ba1a472385f618d5e6ccace76faeb9cf3439b5ab102f49b4123938620face23825115e26a7abcc3d6

Ensuite on peut charger le premier iBoot dans IDA Pro, voici ce qu’on obtient :

ida

Si vous n’y comprenez rien, c’est normal. Dans le monde des systèmes embarqués, les chargeurs d’amorçage et donc l’iBoot doivent être démarrés à une adresse prédéfinie nommée adresse de chargement (loading address en anglais). C’est à cette adresse que l’iBoot va exécuter sa première instruction après un réinitialisation, on appelle aussi cette adresse reset vector.

IDA ne détecte pas automatiquement cette adresse, donc il faut la spécifier. On va donc utiliser un script pour déterminer cette adresse et recharger l’iBoot.

Téléchargez iBoot64helper puis dans File -> Script File, sélectionnez le script que vous venez de télécharger.

done

Si tout se passe bien, vous devriez voir le code assembleur comme sur l’image ci-dessus.

Répétez ces mêmes étapes avec l’iBoot d’iOS 11.0 pour pouvoir continuer.

Diffing

Maintenant que vous avez fait le plus dur, téléchargez Diaphora.

Tout comme avec iBoot64helper vous devez charger un nouveau script Python qui est diaphora.py.

diaph1

Une fenêtre s’affiche. Ainsi pour différencier les deux versions de l’iBoot, Diaphora travaille avec des bases de données SQLite et non sur celles créées par IDA. Il faut donc exporter votre projet I64 ou IDB vers une BDD SQLite.

Comme vous le voyez sur l’image ci-dessus avec l’iBoot de la version 10.3.3, vous n’avez qu’à cliquer sur OK pour commencer l’exportation.

Pour ce qui est du bootloader d’iOS 11.0, relancez Diaphora. Mais avant d’exporter vers une base de données SQLite, sélectionnez le fichier SQLite que vous souhaitez différencier

diaph2

Cliquez sur OK, le programme va commencer à exporter les données vers la BDD SQLite puis différenciera les deux iBoots.

Ainsi Diaphora vous aura ouvert 5 nouvelles fenêtres :

  • Best matches : aucune différence entre les fonctions
  • Partial matches : modifications mineures
  • Unreliable matches : les fonctions comparées ont des similitudes, mais il y a de grandes chances que ce soit des faux positifs
  • Unmatched in primary/secondary : ces fonctions n’ont aucune similitude

De notre côté on va s’intéresser à la fenêtre Partial Matches.

diaph3

Diaphora détermine presque à la perfection quelle fonction de l’iBoot d’iOS 11.0 correspond à celle d’iOS 10.3.3.

Cela permet d’afficher les différences entre ces deux mêmes fonctions au niveau du code assembleur.

asm

On peut aussi différencier deux fonctions à l’aide du pseudo-code pour déterminer plus simplement si vous ne comprenez pas l’assembleur.

pseudo

Il est aussi possible d’avoir une vue graphique des changements, bien que ce ne soit pas le meilleur moyen pour de trouver les différencier certaines fonctions comme on le voit sur l’image ci-dessous

graph

Donc voilà, vous avez eu un aperçu du bindiffing avec Diaphora. Il existe d’autres outils permettant de faire de la comparaison de binaires comme BinDiff, malheureusement celui-ci n’a pas été mis à jour pour IDA 7.x et ne semble pas fonctionner. De plus Diaphora est open source et aussi compatible avec Radare2.

Si vous avez besoin d’infos contactez-moi sur twitter: @matteyeux

Github : https://github.com/matteyeux


Sources : https://github.com/joxeankoret/diaphora

http://www.alex-ionescu.com/?p=271

https://www.hex-rays.com/products/ida/support/idadoc/