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…