Anna Antonenko, die an der Entwicklung eingebetteter Systeme arbeitet und in ihrer Freizeit das BOSS (BEAM-based Operating System with Security) weiterentwickelt, veröffentlichte die Ergebnisse ihrer Reverse Engineering-Analyse des Yamaha PSR-E433 Synthesizers. Im Rahmen dieser Arbeit wurde ein obfusziertes Shell-Interface im Synthesizer entdeckt, das die Ausführung eigenen Codes auf Firmware-Ebene ermöglicht. Der Zugriff auf das Shell-Interface erfolgt durch das Senden von MIDI-Paketen mit SysEx-Nachrichten, die über den USB-Anschluss des Synthesizers übertragen werden können. Die während des Reverse Engineerings gesammelten Informationen über den Chip und die Firmware sowie Beispielcodes und Debug-Dumps sind auf GitHub verfügbar.
Das Interesse am Reverse Engineering entstand vor einigen Jahren, nachdem Anna beschlossen hatte, die Innereien des Synthesizers von Staub zu befreien und gleichzeitig ihrer Neugier nachzugehen, um das Innenleben des Gerätes zu betrachten. Auf der Platine war ein YAMAHA SWL01U-Chip vorhanden, zu dem im Internet keine detaillierten Informationen gefunden werden konnten. Vor einigen Monaten stieß Anna auf ein Handbuch für ein ähnliches Modell des Synthesizers, in dem die Pinbelegung dieses Chips angegeben war. Anna baute das Gerät erneut auseinander und begann mit Experimenten, indem sie die vorhandenen Anschlüsse für die JTAG-Debugging-Schnittstelle und den UART-Port verwendete.

Mit Hilfe des Debuggers OpenOCD, einer Verbindung zu JTAG und verschiedenen Experimenten wurde festgestellt, dass auf der Platine ein Chip mit einem ARM7TDMI-Prozessor-Kern verwendet wird. Durch das Studium der Speicherzuordnung im Debugger gelang es, den Inhalt der im ROM und Flash-Speicher gespeicherten Firmware auszulesen. Danach wurden die Firmware-Abbilder im Reverse Engineering-Paket Ghidra analysiert.
Während der Durchsicht der aus der Firmware extrahierten Textdaten wurde eine Reihe von Begriffen wie ("help", "info", "ver", "logout" usw.) festgestellt, die Befehlen einer Shell ähneln. Eine Untersuchung der Verweise auf diese Begriffe ergab einen Code, der Funktionen zur Verarbeitung von Befehlen aufruft, ähnlich wie bei einer Eingabeschnittstelle und der Kommandozeile. Außerdem wurde festgestellt, dass zur Aktivierung der Shell der Befehl "login" erforderlich ist, bei 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(); // gibt "passwd? " aus shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // gibt "login OK" aus shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { // Befehl tatsächlich ausführen } }
Eine weitere Untersuchung der Firmware ergab, dass die Befehle in Paketen verarbeitet werden, die immer mit denselben 8 Byte Daten beginnen und mit dem Code 0xf7 enden. Da das externe Interagieren mit dem Synthesizer ausschließlich über MIDI erfolgt und die MIDI-Spezifikation einen speziellen Nachrichtentyp für SysEx vorsieht, wurde angenommen, dass dieser für die Übertragung der Befehle verwendet werden kann. Diese Annahme wurde zudem durch die Tatsache gestärkt, dass SysEx-Nachrichten und die von der Shell analysierten Pakete mit dem Code 0xf0 begannen, gefolgt von der Hersteller-ID 0x43 (Yamaha).
Um die Hypothese zu überprüfen, wurde ein Python-Skript geschrieben, das die eingegebenen Daten in MIDI-Protokollpakete 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 der Hilfestellung, die beim Senden des Befehls „help“ angezeigt wurde, 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 Rückgabepunkt im Stack ersetzt wurde, der nach der Bearbeitung des Befehls verwendet wird. In einem ungenutzten Bereich des Speichers wurde als Experiment eine einfache Anwendung in Assembler platziert, die die Zeichenfolge „HeloWrld“ auf einem 8-Zeichen-LCD-Display ausgegeben hat. Das Programm wurde in Form einer normalen MIDI-Datei erstellt, die lediglich an das Gerät übermittelt werden musste.

Daraufhin begann die Arbeit zur Erforschung der Besonderheiten der Grafikdarstellung auf dem LCD-Display, die ihren Höhepunkt in der Vorbereitung eines Codes fand, der willkürliche Pixelinhalte synchron mit der Wiedergabe des Videos „Bad Apple“ auf einem externen Gerät ausgab (Video mit Demonstration).


Quelle: opennet.ru
