Ghidra_arduino_firmware

Dump de la mémoire flash de l’arduino UNO

Pour cela on va utiliser l’outil avrdude permettant d’interragir avec les puces atmel qui sont utilisées sur les arduino.

avrdude -C /etc/avrdude.conf -v -p atmega328p -c arduino -U flash:r:"arduino.hex":r -P/dev/ttyUSB0 -b115200

L’explication du setup:

  • -p atmega328p est la puce principale utilisé sur l’arduino ciblé
  • -c arduino le programmeur
  • -U flash:r:"arduino.hex":r lecture de l’ensemble de la mémoire et écriture dans arduino.hex
  • -P /dev/ttyUSB0 le device reconnu dans les ports séries
  • -b 115200 le baudrate utilisé pour communiqué avec la puce

Ghidra kesako

Ghidra est un logiciel de retroconception logiciel dévelopé par la NSA (Le diable en personne ??).
Lors de son apparition IDA le leader du marché s’est pris une grande claque.
Ghidra a permis d’apporter:

  • Un décompilateur de qualité surtout pour architecture arm.
  • La possibilité de faire Ctrl-Z
  • Du versionning pour travailler en équipe
  • Un bon système de plugin

IDA se reposait sur ces acquis alors que le prix de leur license était à un prix exobitant, Ils ont été obligé d’offrir des license au étudiants mais es ce que cela suffira?

Chargement du firmware dans ghidra

Pour crée un nouveau projet appuyer sur Ctrl-n puis next rentrer le nom du projet et finish:

Lorsque l’on charge le firmware Ghidra ne reconnait pas le format du binaire effectivement on lui fournit un fichier en bare metal. Il n’y a pas de “Magic bytes” permettant d’identifier l’image.
Cependant on va pouvoir s’aider de la Datasheet trouvée.
Pour pouvoir importer correctement le firmware il est nécessaire de connaitre au minimum:

  • le processeur
  • endianess des instructions
  • la tailles des instructions

Grace à la datasheet on retrouve assez facilement que le processeur est un avr et que la tailles d’instruction peut etre de 16 ou 32 mais que la plus part du temps la taille est de 16. Pour ce qui est de endianess la plus part du temps les instructions sont en little endians.

Apres l’importation il reste plus qu’a cliquer sur le dragon vert et notre firmware se charge mais on se rend compte que beaucoup de pointeurs sont manquants et les Interrupts vector ne sont pas forcement bien chargé au bon endroit.

Reconstruction du firmware

A ce moment il y a 2 choix qui s’offre à vous 1 facile et 1 difficile…

Si vous etes chanceux vous pourrez utiliser la version facile qui est la suivante le chargement de svd.

Le SVD (System View Description) est un format de fichier utilisant du XML permettant de décrire l’ensemble des caracteristique d’un firmware bare metal: l’addresse des périphériques, l’organisation de la mémoire, l’ensemble des registres etc.

Il est possible alors d’utiliser un plugin ghidra SVD-Loader pour charger le SVD de notre mémoire. On peut en retrouver un certain nombre sur internet mais tous ne sont pas disponible.

Dans notre cas celui-ci n’existe pas.

Il est alors nécessaire de reconstruire l’ensemble de la mémoire à la main en créant notre propre plugins.

A suivre…