Anna Antonenko, e angazhuar në zhvillimin e sistemeve të integruara dhe në kohën e saj të lirë duke zhvilluar sistemin operativ BOSS (BEAM-based Operating System with Security), publikoi rezultatet e inxhinierisë së kundërt të sintetizuesit muzikor Yamaha PSR-E433. Gjatë punës së realizuar, u konstatua një ndërfaqe shell e obfuskatuar në sintetizues, e cila lejonte organizimin e ekzekutimit të kodit në nivelin e firmware-it. Qasja në ndërfaqen shell realizohet përmes dërgimit të paketave MIDI me mesazhe SysEx, të cilat mund të transmetohen duke lidhur sintetizuesin përmes portës USB. Informacionet e marrë gjatë inxhinierisë së kundërt rreth çipit dhe firmware-ve, si dhe shembuj të kodit dhe dumps për debuggim janë publikuar në GitHub.
Interesi për inxhinierinë e kundërt eru nga disa vjet më parë, pasi Anna vendosi të pastrojë brendësinë e sintetizuesit nga pluhuri dhe përveç kësaj të plotësojë kuriozitetin e saj që lidhet me dëshirën për të parë brendësinë e pajisjes. Në pllaka ishte çipi YAMAHA SWL01U, për të cilin në internet nuk arriti të gjente informacion të hollësishëm. Pak muaj më parë, Anna u ndesh me një manual për një model të ngjashëm të sintetizuesit, në të cilin ishte dhënë pinsimi i këtij çipi. Anna e shpartalloi përsëri pajisjen dhe filloi eksperimente, duke shfrytëzuar daljet që ishin në pllakë për ndërfaqen e debuggimit JTAG dhe portin UART.

Me ndihmën e debugguesit OpenOCD, lidhjes me JTAG dhe eksperimenteve, u zbulua se në pllakë përdoret një çip me bërthamë procesori ARM7TDMI. Duke studiuar renditjen e memories në debuggues, ishte e mundur të shkarkohej përmbajtja e firmware-ve të vendosur në ROM dhe Flash-memorie. Pas kësaj, imazhet e firmware-ve u analizuan në paketën për inxhinieri të kundërt Ghidra.
Gjatë shikimit të rreshtave të dhënave të nxjerra nga firmware, u vërejt një grup komandash («help», «info», «ver», «logout» etj.), që i ngjajnë komandave të shell-it. Studimi i treguesve për këto komanda lehtësuan gjetjen e kodit që thërret funksionet për përpunimin e komandave, duke ngjallur një përvojë hyrëse dhe shell. Po ashtu, u zbulua se për aktivizimin e shell-it është parashikuar komanda «login», e cila kërkon kalimin e fjalëkalimit «#0000». void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, «login») == 0) { shell_ask_passwd(); // printon «passwd? » shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, «#0000») == 0) { shell_login_ok(); // printon «login OK» shell_login_state = 2; } else { shell_print(«Passwd Error\r»); shell_login_state = 0; } } else { // realisht ekzekuto komandën } }
Studimi i mëtutjeshëm i firmware zbuloi se komandat përpunohen në paketa, të cilat fillojnë gjithmonë me të njëjtat 8 bajta të dhënash dhe përfundojnë me kodin 0xf7. Duke qenë se ndërveprimi me sintetizuesin kryhet vetëm nëpërmjet MIDI, dhe specifikimi MIDI përfshin një lloj mesazhi të veçantë të shërbimit SysEx, u supozua se ky mesazh mund të përdoret për të transmetuar komandat. Hipoteza u mbështet edhe nga fakti që mesazhet SysEx dhe paketat e interpretuara nga shell-i fillonin me kodin 0xf0, i ndjekur nga identifikuesi i prodhuesit 0x43 (Yamaha).
Për të verifikuar hipotezën, u shkrua një skript Python, i cili transmetonte të dhënat e futura në paketa të protokollit MIDI. Metoda dha rezultat: 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ë sugjerimin e treguar gjatë dërgimit të komandës «help», mes të tjerash kishte komandat për ndryshimin e përmbajtjes së memories. Me ndihmën e këtyre komandave, ishte e mundshme të ngarkohej kod i rastësishëm në memorje dhe t'i kalonte kontrollin, duke zëvendësuar treguesin në grumbull, i përdorur për rikthimin pas përfundimit të procesimit të komandës. Si një eksperiment, në një zonë të pavendosur të memories, u vendos një aplikacion i thjeshtë i shkruar në assembler, i cili nxirrte vargun «HeloWrld» në një tregues LCD të 8 karaktereve. Programi ishte formatuar si një skedar MIDI i zakonshëm, që duhej thjesht të dërgohej në pajisje.

Pas kësaj, filloi puna për studimin e karakteristikave të daljes së grafikës në LCD, kulmin e së cilës e përbënte përgatitja e kodit që shfaqte përmbajtje rastësore pikseli në zonën simbolike, në sinkron me riprodhimin e videos Bad Apple në një pajisje të jashtme (video me demonstrim).


Burimi: opennet.ru
