Den dolda kommandotolken i synthesizern Yamaha, som möjliggjorde kodkörning via MIDI

Anna Antonenko, som arbetar med utveckling av inbyggda system och på sin fritid utvecklar operativsystemet BOSS (BEAM-baserat operativsystem med säkerhet), har publicerat resultaten av omvänd ingenjörskonst av den musikaliska synthesizern Yamaha PSR-E433. Under arbetet identifierades en obfuskerad shell-gränssnitt i synthesizern, vilket möjliggjorde körning av egen kod på firmware-nivå. Åtkomsten till shell-gränssnittet sker genom att skicka MIDI-paket med SysEx-meddelanden, vilka kan överföras vid anslutning av synthesizern via USB-porten. De insamlade uppgifterna från den omvända ingenjörskonsten, inklusive information om chipet och firmware, samt kodexempel och debugdumpningar, finns på GitHub.

Intresset för omvänd ingenjörskonst uppstod för flera år sedan, efter att Anna beslutade sig för att rengöra innandömet på synthesizern från damm och samtidigt tillfredsställa sin nyfikenhet kopplad till att vilja se vad enheten innehåller. På kretskortet fanns en chip YAMAHA SWL01U, om vilken det inte gick att hitta detaljerad information på internet. För ett par månader sedan stötte Anna på en manual för en liknande modell av synthesizer, där en pinout för chipet angavs. Anna demonterade enheten igen och började experimentera, med hjälp av de tillgängliga pinnar på kretskortet för debuggränssnittet JTAG och UART-porten.

Den dolda kommandotolken i synthesizern Yamaha, som möjliggjorde kodkörning via MIDI

Genom att använda OpenOCD-debuggern, anslutning till JTAG och experimenterande kom det fram att det på kretskortet används ett chip med ARM7TDMI-processorkärna. Genom att studera minneslayouten i debuggern lyckades man extrahera innehållet i firmware som lagras i ROM och Flash-minne. Efter detta analyserades firmwarebilderna i omvänd ingenjörspaketet Ghidra.

Vid granskningen av strängdata som extraherats från firmware upptäcktes en uppsättning av strängar ("help", "info", "ver", "logout" osv.) som påminner om kommandon i ett programgränssnitt. Genom att studera pekarna till dessa strängar gick det att hitta kod som anropade funktioner för att bearbeta kommandon, liknande en inloggningsgränssnitt och kommandotolk. Det framgick också att det finns ett kommando "login" som kräver att lösenordet "#0000" anges. void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); // skriver ut "passwd? " shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // skriver ut "login OK" shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { // köra kommandot } }

Vid ytterligare undersökning av firmware visade det sig att kommandon behandlas i paket som alltid börjar med samma 8 byte data och avslutas med koden 0xf7. Eftersom extern interaktion med syntetizern endast sker via MIDI, och i MIDI-specifikationen finns en speciell typ av SysEx-meddelanden, misstänktes det att just dessa kunde användas för att skicka kommandon. Teorin stöddes också av att SysEx-meddelanden och de paket som tolkades av gränssnittet inleddes med koden 0xf0, följt av tillverkarens identifierare 0x43 (Yamaha).

För att verifiera hypotesen skrevs ett Python-skript som översatte den inmatade datan till MIDI-protokollpaket. Och metoden fungerade: 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 >

I den hjälptext som visas när kommandot "help" skickas fanns bland annat kommandon för att ändra innehållet i minnet. Med hjälp av dessa kommandon kunde man ladda godtycklig kod i minnet och överföra kontrollen till den genom att ändra pekaren i stacken som används för att återgå efter kommandobehandling. Som ett experiment placerades en enkel applikation, skriven i assembler, i ett oanvänt minnesområde som skriver ut strängen "HeloWrld" på en 8-teckens LCD-display. Programmet var utformat som en vanlig MIDI-fil som kunde överföras till enheten.

Den dolda kommandotolken i synthesizern Yamaha, som möjliggjorde kodkörning via MIDI

Därefter började arbetet med att studera egenskaperna hos grafikutsignalering på LCD-displayen, vilket kulminerade i beredningen av kod som visar godtyckligt pixelinnehåll i teckenområdet, synkront med uppspelning av videon Bad Apple på en extern enhet (video med demonstration).

Den dolda kommandotolken i synthesizern Yamaha, som möjliggjorde kodkörning via MIDI
Spela video


Källa: opennet.ru
Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster