Si Anna Antonenko, na bumuo ng mga naka-embed na system at sa kanyang bakanteng oras ay bumuo ng BOSS (BEAM-based Operating System with Security) operating system, ay naglathala ng mga resulta ng reverse engineering ang Yamaha PSR-E433 music synthesizer. Sa panahon ng gawaing isinagawa, ang isang obfuscated shell interface ay nakilala sa synthesizer, na naging posible upang ayusin ang pagpapatupad ng code nito sa antas ng firmware. Naa-access ang interface ng shell sa pamamagitan ng pagpapadala ng mga MIDI packet na naglalaman ng mga mensahe ng SysEx, na maaaring ipadala kapag nakakonekta ang synthesizer sa pamamagitan ng USB. Ang impormasyon tungkol sa chip at firmware na nakuha sa panahon ng reverse engineering, pati na rin ang mga halimbawa ng code at mga debugging dump, ay nai-post sa GitHub.
Ang interes sa reverse engineering ay lumitaw ilang taon na ang nakalilipas, matapos magpasya si Anna na linisin ang loob ng synthesizer mula sa alikabok at sa parehong oras ay nasiyahan ang kanyang pag-usisa na may kaugnayan sa pagnanais na makita ang loob ng aparato. Ang board ay naglalaman ng isang YAMAHA SWL01U chip, tungkol sa kung saan ang detalyadong impormasyon ay hindi matagpuan sa Internet. Ilang buwan na ang nakalilipas, nakita ni Anna ang isang manual para sa isang katulad na modelo ng synthesizer, na naglalaman ng pinout ng chip na ito. Muling binuwag ni Anna ang device at nagsimulang mag-eksperimento, gamit ang mga pin na available sa board para sa interface ng debug ng JTAG at sa UART port.

Gamit ang OpenOCD debugger, kumokonekta sa JTAG at mga eksperimento, nalaman na ang board ay gumagamit ng chip na may ARM7TDMI processor core. Ang pagkakaroon ng pag-aaral ng memory layout sa debugger, nagawa naming i-unload ang mga nilalaman ng firmware na matatagpuan sa ROM at Flash memory. Ang mga imahe ng firmware ay sinuri gamit ang Ghidra reverse engineering package.
Habang tinitingnan ang string data na nakuha mula sa firmware, napansin ang isang hanay ng mga linya ("tulong", "impormasyon", "ver", "logout", atbp.) na kahawig ng mga shell command. Ang pagsusuri sa mga pointer sa mga linyang ito ay nagsiwalat ng code na tinatawag na mga function upang iproseso ang mga utos, na nakapagpapaalaala sa isang login interface at isang command shell. Ipinahayag din na upang maisaaktibo ang shell, ang command na "login" ay ibinigay, kung saan kailangan mong ipasa ang password na "#0000". void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); // nagpi-print ng "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 { // aktwal na patakbuhin ang command } }
Ang karagdagang pagsusuri sa firmware ay nagpakita na ang mga utos ay pinoproseso sa mga batch, palaging nagsisimula sa parehong 8 byte ng data at nagtatapos sa code na 0xf7. Dahil ang panlabas na pakikipag-ugnayan sa synthesizer ay isinasagawa lamang sa pamamagitan ng MIDI, at ang detalye ng MIDI ay nagbibigay ng isang espesyal na uri ng serbisyo ng mga mensahe ng SysEx, ipinapalagay na ito ay magagamit upang magpadala ng mga utos. Ang karagdagang pagpapalakas ng hula ay ang mga mensahe at packet ng SysEx na na-parse ng shell ay nagsimula sa isang solong code, 0xf0, na sinusundan ng manufacturer ID 0x43 (Yamaha).
Upang subukan ang hypothesis, isang script ng Python ang isinulat na nagsalin ng data ng input sa mga MIDI protocol packet. At gumana ang pamamaraan: 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 m/l ADDRESS DATA > info DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber # 3341 Gumawa ng data at oras MAY 16 2012 19:00:57 J/E Piliin ang English >
Ang prompt na ipinapakita kapag nagpapadala ng "help" command ay kasama, bukod sa iba pang mga bagay, mga command para sa pagbabago ng mga nilalaman ng memorya. Gamit ang mga utos na ito, posible na i-load ang arbitrary code sa memorya at ilipat ang kontrol dito, na pinapalitan ang pointer sa stack na ginamit upang bumalik pagkatapos makumpleto ang pagpoproseso ng command. Bilang isang eksperimento, isang simpleng application na nakasulat sa wika ng pagpupulong ay inilagay sa isang hindi nagamit na lugar ng memorya na naglalabas ng string na "HeloWrld" sa isang 8-character na tagapagpahiwatig ng LCD. Na-format ang program bilang regular na MIDI file, na kailangan lang ilipat sa device.

Pagkatapos nito, nagsimula ang trabaho sa pag-aaral ng mga feature ng graphics output sa isang LCD display, na nagtatapos sa paghahanda ng code na naglalabas ng di-makatwirang nilalaman ng pixel sa lugar ng character, kasabay ng pag-playback ng Bad Apple video sa isang panlabas na device (video na may demonstrasyon ).


Pinagmulan: opennet.ru
