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.

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.

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).


KĂ€lla: opennet.ru
