Verstecktes Kommando-Interface im Yamaha-Synthesizer, das die Ausführung von Code über MIDI ermöglichte

Anna Antonenko, die sich mit der Entwicklung eingebetteter Systeme beschäftigt und in ihrer Freizeit das Betriebssystem BOSS (BEAM-basierte Betriebssystem mit Sicherheit) weiterentwickelt, veröffentlichte die Ergebnisse ihrer Reverse-Engineering-Arbeiten an dem Yamaha PSR-E433 Synthesizer. Während der durchgeführten Arbeiten wurde im Synthesizer eine obfuskierte Shell-Oberfläche entdeckt, die es ermöglichte, eigenen Code auf Firmware-Ebene auszuführen. Der Zugang zur Shell-Oberfläche erfolgt durch das Senden von MIDI-Paketen mit SysEx-Nachrichten, die beim Anschluss des Synthesizers über den USB-Port übertragen werden können. Die während des Reverse Engineerings gewonnenen Informationen über den Chip und die Firmware sowie Beispielcode und Debug Dumps sind auf GitHub veröffentlicht.

Das Interesse am Reverse Engineering entstand vor einigen Jahren, nachdem Anna beschlossen hatte, die Innereien des Synthesizers von Staub zu reinigen und gleichzeitig ihrer Neugier nachzugehen, das Innenleben des Geräts zu betrachten. Auf der Platine war der Chip YAMAHA SWL01U vorhanden, über den im Internet keine detaillierten Informationen zu finden waren. Vor ein paar Monaten stieß Anna auf ein Handbuch zu einem ähnlichen Modell des Synthesizers, in dem die Pinbelegung dieses Chips angegeben war. Anna zerlegte das Gerät erneut und begann mit Experimenten, indem sie die vorhandenen Pins für die Debug-Schnittstelle JTAG und den UART-Port nutzte.

Verstecktes Kommando-Interface im Yamaha-Synthesizer, das die Ausführung von Code über MIDI ermöglichte

Durch den Einsatz des Debuggers OpenOCD, die Verbindung zu JTAG und Experimente wurde festgestellt, dass auf der Platine ein Chip mit ARM7TDMI-Prozessorkern verwendet wird. Nach der Untersuchung des Speicherlayouts im Debugger gelang es, den Inhalt der in ROM und Flash-Speicher abgelegten Firmware zu extrahieren. Anschließend wurden die Firmware-Abbilder im Reverse-Engineering-Paket Ghidra analysiert.

Bei der Analyse der aus der Firmware extrahierten Zeichenfolgen wurde eine Reihe von Befehlen ("help", "info", "ver", "logout" usw.) festgestellt, die wie Befehle einer Kommandozeile aussehen. Die Untersuchung der Verweise auf diese Zeichenfolgen ergab einen Code, der Funktionen zum Verarbeiten von Befehlen aufruft, die an ein Login-Interface und eine Kommandozeile erinnern. Es wurde außerdem festgestellt, dass zum Aktivieren der Shell der Befehl "login" vorgesehen ist, dem das Passwort "#0000" übergeben werden muss. void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); \/\/ druckt "passwd? " shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); \/\/ druckt "login OK" shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { \/\/ tatsächlich den Befehl ausführen } }

Eine weitergehende Untersuchung der Firmware zeigte, dass die Befehle in Paketen verarbeitet werden, die immer mit denselben 8 Bytes Daten beginnen und mit dem Code 0xf7 enden. Da die externe Interaktion mit dem Synthesizer ausschließlich über MIDI erfolgt und in der MIDI-Spezifikation ein spezieller Diensttyp von Nachrichten, SysEx, vorgesehen ist, wurde vermutet, dass genau dieser zur Übertragung von Befehlen verwendet werden könnte. Diese Annahme wurde auch dadurch gestützt, dass sowohl SysEx-Nachrichten als auch die von der Shell interpretierten Pakete mit dem Code 0xf0 begannen, gefolgt von der Hersteller-ID 0x43 (Yamaha).

Um die Hypothese zu testen, wurde ein Python-Skript geschrieben, das die eingegebenen Daten in Pakete des MIDI-Protokolls umwandelte. Und die Methode funktionierte: 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 >

In den Hinweisen, die beim Senden des Befehls „help“ angezeigt wurden, waren unter anderem Befehle zur Änderung des Inhalts des Speichers enthalten. Mit diesen Befehlen konnte beliebiger Code in den Speicher geladen und die Kontrolle darüber übernommen werden, indem der Zeiger im Stack ersetzt wurde, der für die Rückgabe nach der Ausführung des Befehls verwendet wurde. Im Rahmen eines Experiments wurde in einem ungenutzten Speicherbereich eine einfachste Anwendung in Assembler platziert, die die Zeichenfolge „HeloWrld“ auf einem 8-Zeichen-LCD-Display anzeigte. Das Programm war als gewöhnliche MIDI-Datei formatiert, die einfach an das Gerät weitergeleitet werden musste.

Verstecktes Kommando-Interface im Yamaha-Synthesizer, das die Ausführung von Code über MIDI ermöglichte

Daraufhin begann die Arbeit zur Untersuchung der Besonderheiten der Grafikdarstellung auf dem LCD-Display, die ihren Höhepunkt in der Vorbereitung von Code fand, der beliebige Pixelinhalte synchron zur Wiedergabe des Videos „Bad Apple“ auf einem externen Gerät ausgab (Video mit einer Demo).

Verstecktes Kommando-Interface im Yamaha-Synthesizer, das die Ausführung von Code über MIDI ermöglichte
Video abspielen


Quelle: opennet.ru
60GB SSD 8Gb DDR4