Verborgen opdrachtregelinterface in de synthesizer Yamaha, die het mogelijk maakte om code via MIDI uit te voeren

Anna Antonenko, die zich bezighoudt met de ontwikkeling van embedded systemen en in haar vrije tijd het BOSS (BEAM-based Operating System with Security) besturingssysteem ontwikkelt, heeft de resultaten van het reverse engineering van de Yamaha PSR-E433 muzieksynthesizer gepubliceerd. Tijdens het uitgevoerde werk werd er een verborgene shell-interface in de synthesizer ontdekt, die het mogelijk maakte om eigen code op firmware-niveau uit te voeren. Toegang tot de shell-interface is mogelijk door het verzenden van MIDI-pakketten met SysEx-berichten, die kunnen worden verzonden wanneer de synthesizer via de USB-poort is aangesloten. De verkregen informatie gedurende het reverse engineering proces over de chip en firmware, evenals codevoorbeelden en debug-dumps zijn beschikbaar op GitHub.

De interesse in reverse engineering ontstond enkele jaren geleden, toen Anna besloot om het interieur van de synthesizer van stof te ontdoen en haar nieuwsgierigheid te bevredigen door te kijken naar de interne componenten van het apparaat. Op de printplaat was een YAMAHA SWL01U-chip aanwezig, waarover online geen gedetailleerde informatie te vinden was. Een paar maanden geleden stuitte Anna op een handleiding voor een vergelijkbaar model van de synthesizer, waarin de pinout van deze chip was weergegeven. Anna demonteerde het apparaat opnieuw en begon experimenten uit te voeren, gebruikmakend van de beschikbare pinnen op de printplaat voor de JTAG-debuginterface en de UART-poort.

Verborgen opdrachtregelinterface in de synthesizer Yamaha, die het mogelijk maakte om code via MIDI uit te voeren

Met behulp van de OpenOCD-debugger, een verbinding met JTAG en experimenten werd vastgesteld dat er op de printplaat een chip met een ARM7TDMI-processorkern wordt gebruikt. Door de geheugendistributie in de debugger te bestuderen, slaagde men erin om de inhoud van de firmware opgeslagen in het ROM en Flash-geheugen te extraheren. Vervolgens werden deze firmware-images geanalyseerd met de reverse engineering software Ghidra.

Tijdens het bekijken van de uit de firmware geëxtraheerde tekstgegevens is een set strings opgemerkt (zoals «help», «info», «ver», «logout», enzovoort) die lijken op commando's van een shell. Onderzoek naar de verwijzingen naar deze strings heeft een code aan het licht gebracht die functies aanroept voor het verwerken van commando's, wat doet denken aan een inloginterface en een shell. Daarnaast is vastgesteld dat er een commando «login» is waarmee een wachtwoord «#0000» moet worden doorgegeven. void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // prints «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // prints «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // voer het commando daadwerkelijk uit } }

Verder onderzoek naar de firmware toonde aan dat de commando's in pakketten werden verwerkt, die altijd beginnen met dezelfde 8 bytes aan gegevens en eindigen met de code 0xf7. Aangezien de externe interactie met de synthesizer uitsluitend via MIDI plaatsvindt, en in de MIDI-specificatie een speciaal soort SysEx-berichten is gedefinieerd, werd verondersteld dat dit type gebruikt kan worden voor het verzenden van commando's. De aanname werd versterkt door het feit dat SysEx-berichten en de pakketten die door de shell worden geanalyseerd begonnen met de code 0xf0, gevolgd door de producent-ID 0x43 (Yamaha).

Om de hypothese te testen, is er een Python-script geschreven dat de ingevoerde gegevens naar MIDI-protocolpakketten vertaald. De methode werkte: 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 de hint die werd weergegeven bij het verzenden van het commando 'help', stonden onder andere commando's voor het wijzigen van de inhoud van het geheugen. Met deze commando's kon willekeurige code in het geheugen worden geladen en kon de controle daarover worden overgedragen door de pointer op de stack te vervangen die werd gebruikt voor terugkeer na de verwerking van het commando. Als experiment werd er in een ongebruikt deel van het geheugen een eenvoudig programma geschreven in assembler, dat de string 'HeloWrld' weergeeft op een 8-teken LCD-display. Het programma was vormgegeven als een gewone MIDI-bestand, dat gewoon naar het apparaat moest worden verzonden.

Verborgen opdrachtregelinterface in de synthesizer Yamaha, die het mogelijk maakte om code via MIDI uit te voeren

Daarna begon het werk aan het begrijpen van de eigenschappen van de grafische uitvoer op het LCD-display, waarvan de climax de voorbereiding van de code was die willekeurige pixelinhoud in het tekengebied produceert, synchroon met de weergave van de video Bad Apple op een extern apparaat (video met demonstratie).

Verborgen opdrachtregelinterface in de synthesizer Yamaha, die het mogelijk maakte om code via MIDI uit te voeren
Video afspelen


Bron: opennet.ru
Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster