Une interface de commande cachée dans le synthétiseur Yamaha, permettant d'exécuter du code via MIDI

Anna Antonenko, qui travaille sur le développement de systèmes embarqués et consacre son temps libre au développement du système d'exploitation BOSS (BEAM-based Operating System with Security), a publié les résultats de l'ingénierie inverse du synthétiseur musical Yamaha PSR-E433. Au cours de ce travail, une interface shell obfusquée a été découverte dans le synthétiseur, permettant d'exécuter du code au niveau du firmware. L'accès à l'interface shell se fait en envoyant des paquets MIDI avec des messages SysEx, qui peuvent être transmis lors de la connexion du synthétiseur via le port USB. Les informations obtenues lors de l'ingénierie inverse concernant la puce et les firmwares, ainsi que des exemples de code et des dumps de débogage, sont publiées sur GitHub.

L'intérêt pour l'ingénierie inverse est né il y a quelques années, après qu'Anna a décidé de nettoyer l'intérieur du synthétiseur de la poussière et de satisfaire sa curiosité concernant le fonctionnement de l'appareil. La carte comportait une puce YAMAHA SWL01U, pour laquelle il n'a pas été possible de trouver des informations détaillées sur Internet. Il y a quelques mois, Anna a trouvé un manuel pour un modèle de synthétiseur similaire qui contenait le schéma de cette puce. Anna a à nouveau démonté l'appareil et a commencé à réaliser des expériences, utilisant les broches disponibles sur la carte pour l'interface de débogage JTAG et le port UART.

Une interface de commande cachée dans le synthétiseur Yamaha, permettant d'exécuter du code via MIDI

Grâce au débogueur OpenOCD, à la connexion JTAG et aux expériences, il a été découvert que la carte utilise une puce avec un noyau de processeur ARM7TDMI. En étudiant la disposition de la mémoire dans le débogueur, il a été possible de décharger le contenu des firmwares stockés dans la ROM et la mémoire Flash. Par la suite, les images de firmware ont été analysées à l'aide du paquet Ghidra pour l'ingénierie inverse.

Lors de l'examen des données textuelles extraites du firmware, un ensemble de chaînes («help», «info», «ver», «logout», etc.) a été remarqué, ressemblant à des commandes de shell. L'étude des pointeurs de ces chaînes a permis de trouver du code appelé à exécuter des fonctions pour traiter des commandes, similaire à une interface de connexion et à un shell. Il a également été révélé qu'une commande «login» était prévue pour activer le shell, à laquelle il fallait passer le mot de passe «#0000». void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // affiche «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // affiche «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // exécute réellement la commande } }

Une étude plus approfondie du firmware a montré que les commandes étaient traitées par paquets, commençant toujours par les mêmes 8 octets de données et se terminant par le code 0xf7. Comme l'interaction externe avec le synthétiseur se faisait uniquement via MIDI, et que la spécification MIDI prévoyait un type de message spécial SysEx, il était supposé que c'était celui-ci qui pouvait être utilisé pour transmettre des commandes. L'hypothèse était également soutenue par le fait que les messages SysEx et les paquets interprétés par le shell commençaient par un code 0xf0, suivi de l'identifiant du fabricant 0x43 (Yamaha).

Pour vérifier l'hypothèse, un script Python a été écrit pour traduire les données saisies en paquets du protocole MIDI. Et la méthode a fonctionné : login passwd? #0000 login OK > help logout help ? info ver stack perf-on perf-off perf-disp d dp d xxxxx d/s xxxxx m ADDRESS DATA m/b ADDRESS DATA m/w ADDRESS DATA m/l ADDRESS DATA > info DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber #3341 Make data & time MAY 16 2012 19:00:57 J/E Select English >

Dans l'invite affichée lors de l'envoi de la commande «help», figuraient entre autres des commandes pour modifier le contenu de la mémoire. Grâce à ces commandes, il était possible de charger du code arbitraire en mémoire et de transférer le contrôle vers celui-ci en remplaçant le pointeur dans la pile, utilisé pour le retour après le traitement de la commande. En guise d'expérience, une application basique, écrite en assembleur, a été placée dans une zone de mémoire inutilisée, affichant la chaîne «HeloWrld» sur un indicateur à cristaux liquides de 8 caractères. Le programme était formaté comme un fichier MIDI ordinaire, qu'il suffisait de transmettre à l'appareil.

Une interface de commande cachée dans le synthétiseur Yamaha, permettant d'exécuter du code via MIDI

Par la suite, des travaux ont commencé pour étudier les particularités de l'affichage graphique sur des écrans à cristaux liquides, culminant avec la préparation d'un code capable d'afficher un contenu pixelisé arbitraire dans la zone de caractères, en synchronisation avec la lecture de la vidéo Bad Apple sur un appareil externe (vidéo de démonstration).

Une interface de commande cachée dans le synthétiseur Yamaha, permettant d'exécuter du code via MIDI
Lire la vidéo


Source : opennet.ru
Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster