Anna Antonenko, një zhvillues i sistemeve të integruara dhe njëkohësisht punon për zhvillimin e një sistemi operativ BOSS (BEAM-based Operating System with Security), publikoi rezultatet e inxhinierisë së prapme të sintetizatorit muzikor Yamaha PSR-E433. Gjatë punës së bërë, në sintetizator u identifikua një ndërfaqe shell e obfuscatuar, e cila lejonte ekzekutimin e kodit në nivelin e firmware-it. Qasja në ndërfaqen shell bëhet përmes dërgimit të paketimeve MIDI me mesazhe SysEx, të cilat mund të dërgohen kur sintetizatori është i lidhur përmes portit USB. Të dhënat e mbledhura gjatë inxhinierisë së prapme mbi çipin dhe firmware-et, si dhe shembujt e kodit dhe dump-et e shqyrtimit janë publikuar në GitHub.
Interesi për inxhinierinë e prapme lindi disa vite më parë, pasi Anna vendosi të pastrojë brendësinë e sintetizatorit nga pluhuri dhe njëkohësisht të kënaqë kuriozitetin e saj lidhur me dëshirën për të parë brendinë e pajisjes. Në pllakën e saj ndodhej çipi YAMAHA SWL01U, për të cilin nuk ishte e mundur të gjendej informacion i detajuar në internet. Disa muaj më parë, Anna zbuloi një udhëzues për një model të ngjashëm sintetik, ku kishte përfshirë pinout-in e këtij çipi. Anna e çmontoi përsëri pajisjen dhe filloi eksperimentet, duke shfrytëzuar daljet e disponueshme në pllakë për ndërfaqen e shqyrtimit JTAG dhe portin UART.

Nëpërmjet debugger-it OpenOCD, lidhjes me JTAG dhe eksperimenteve u zbulua se në pllakë përdorej një çip me bërthamë procesori ARM7TDMI. Pas shqyrtimit të renditjes së memories në debugger, arriti të eksportojë përmbajtjen e firmware-eve që ndodheshin në ROM dhe Flash-memory. Pas kësaj, imazhet e firmware-it u analizuan në paketën për inxhinierinë e prapme Ghidra.
Gjatë shqyrtimit të të dhënave tekstuale të nxjerra nga firmware-i, u vërejt një grup rreshtash («help», «info», «ver», «logout» dhe të tjerë) që i ngjanin komanduese e ndërfaqeve të programuar. Hetimi i treguesve të këtyre rreshtave lejoj që të gjejmë kodin që thërriste funksionet për përpunimin e komandave, që i ngjanin ndërfaqes së hyrjes dhe shell-it. U zbulua gjithashtu se për aktivizimin e shell-it parashikohej një komandë «login», ku nevojitej të dërgohej një fjalëkalim «#0000». 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 { // actually run the command } }
Studimi i mëtejmë i firmware-it tregoi se komandat përpunoheshin në paketa, që gjithmonë fillonin me të njëjtat 8 byte të dhënash dhe përfundonin me kodin 0xf7. Duke qenë se ndërveprimi i jashtëm me sintetizatorin bëhej vetëm përmes MIDI, dhe në specifikimin MIDI ishte parashikuar një lloj mesazhi të infrastrukturës SysEx, u supozua se ai mund të përdorej për dërgimin e komandave. Dyshimi gjithashtu u përforcua nga fakti se mesazhet SysEx dhe paketat që analizoheshin nga shell-i fillonin me kodin 0xf0, i ndjekur nga identifikuesi i prodhuesit 0x43 (Yamaha).
Për të verifikuar hipotezën, u shkrua një skenar Python-i, i cili përkthej të dhënat e futur në paketa protokolli MIDI. Dhe metoda funksionoi: 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 >
Në ndihmën e shfaqur kur dërgohej komanda «help», përveç të tjerash ishin komandat për të ndryshuar përmbajtjen e memories. Me ndihmën e këtyre komandave, ishte e mundur të ngarkohej kodi në memorie dhe t'i jepeshin drejtim ata, duke zëvendësuar treguesin në stack, i përdorur për rikthimin pas përfundimit të përpunimit të komandës. Si eksperimente, në një zonë të pavendosur të memories u vendos një aplikacion i thjeshtë, i shkruar në assembler, që shfaqte rreshtin «HeloWrld» në një tregues 8-shenjash LCD. Programi ishte formuar si një skedar MIDI të zakonshëm, i cili ishte mjaft për ta kaluar në pajisje.

Pas kësaj, filloi puna për të studiuar veçoritë e shfaqjes së grafikës në LCD, kulminacioni i të cilës ishte përgatitja e kodit që shfaqte përmbajtje pikseli të rastit në zonën simbolike, sinkron me rikthimin e videos Bad Apple në një pajisje të jashtme (video e demostrimit).


Burimi: opennet.ru
