Anna Antonenko, yang membangunkan sistem terbenam dan dalam masa lapangnya membangunkan sistem pengendalian BOSS (Sistem Operasi berasaskan BEAM dengan Keselamatan), menerbitkan hasil kejuruteraan terbalik pensintesis muzik Yamaha PSR-E433. Semasa kerja dijalankan, antara muka shell yang dikelirukan telah dikenal pasti dalam pensintesis, yang memungkinkan untuk mengatur pelaksanaan kodnya pada tahap firmware. Antara muka shell diakses dengan menghantar paket MIDI yang mengandungi mesej SysEx, yang boleh dihantar apabila pensintesis disambungkan melalui USB. Maklumat tentang cip dan perisian tegar yang diperoleh semasa kejuruteraan terbalik, serta contoh kod dan pembuangan debugging, disiarkan pada GitHub.
Minat dalam kejuruteraan terbalik timbul beberapa tahun lalu, selepas Anna memutuskan untuk membersihkan bahagian dalam pensintesis daripada habuk dan pada masa yang sama memenuhi rasa ingin tahunya berkaitan keinginan untuk melihat bahagian dalam peranti. Papan tersebut mengandungi cip YAMAHA SWL01U, yang maklumat terperincinya tidak dapat ditemui di Internet. Beberapa bulan yang lalu, Anna menemui manual untuk model pensintesis serupa, yang mengandungi pinout cip ini. Anna sekali lagi membuka peranti dan memulakan percubaan, menggunakan pin yang tersedia pada papan untuk antara muka nyahpepijat JTAG dan port UART.

Menggunakan penyahpepijat OpenOCD, menyambung ke JTAG dan eksperimen, didapati bahawa papan menggunakan cip dengan teras pemproses ARM7TDMI. Setelah mengkaji susun atur memori dalam penyahpepijat, kami dapat memunggah kandungan perisian tegar yang terletak dalam memori ROM dan Flash. Imej perisian tegar kemudiannya dianalisis menggunakan pakej kejuruteraan terbalik Ghidra.
Semasa melihat data rentetan yang diekstrak daripada perisian tegar, satu set baris ("bantuan", "maklumat", "ver", "log keluar", dll.) telah diperhatikan yang menyerupai arahan shell. Meneliti penunjuk kepada baris ini mendedahkan kod yang dipanggil fungsi untuk memproses arahan, mengingatkan antara muka log masuk dan shell arahan. Ia juga mendedahkan bahawa untuk mengaktifkan shell, arahan "log masuk" disediakan, yang mana anda perlu lulus kata laluan "#0000". void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); // mencetak "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 { // sebenarnya jalankan arahan } }
Pemeriksaan lanjut terhadap perisian tegar menunjukkan bahawa arahan diproses dalam kelompok, sentiasa bermula dengan 8 bait data yang sama dan berakhir dengan kod 0xf7. Memandangkan interaksi luaran dengan pensintesis dijalankan hanya melalui MIDI, dan spesifikasi MIDI menyediakan jenis perkhidmatan khas mesej SysEx, diandaikan bahawa ini boleh digunakan untuk menghantar arahan. Mengukuhkan lagi tekaan adalah bahawa mesej dan paket SysEx yang dihuraikan oleh shell bermula dengan kod tunggal, 0xf0, diikuti oleh ID pengilang 0x43 (Yamaha).
Untuk menguji hipotesis, skrip Python telah ditulis yang menterjemah data input ke dalam paket protokol MIDI. Dan kaedah itu berfungsi: log masuk passwd? #0000 log masuk OK > bantu log keluar bantuan ? info ver tindanan perf-on perf-off perf-disp d dp d xxxxx d/s xxxxx m DATA ALAMAT m/b DATA ALAMAT m/b DATA ALAMAT m/l DATA ALAMAT > maklumat Nama Pembangunan PSR-E433 Nombor Pembangunan #3341 Nombor Pembangunan Utama # 3341 Buat data & masa 16 MEI 2012 19:00:57 J/E Pilih Bahasa Inggeris >
Gesaan yang ditunjukkan semasa menghantar arahan "bantuan" termasuk, antara lain, arahan untuk menukar kandungan memori. Menggunakan arahan ini, adalah mungkin untuk memuatkan kod sewenang-wenangnya ke dalam memori dan memindahkan kawalan kepadanya, menggantikan penunjuk pada tindanan yang digunakan untuk kembali selepas selesai pemprosesan arahan. Sebagai percubaan, aplikasi ringkas yang ditulis dalam bahasa himpunan diletakkan dalam kawasan memori yang tidak digunakan yang mengeluarkan rentetan "HeloWrld" kepada penunjuk paparan LCD 8 aksara. Program ini telah diformatkan sebagai fail MIDI biasa, yang hanya perlu dipindahkan ke peranti.

Selepas ini, kerja bermula untuk mengkaji ciri-ciri output grafik pada paparan LCD, yang memuncak dalam penyediaan kod yang mengeluarkan kandungan piksel sewenang-wenang ke dalam kawasan aksara, serentak dengan main balik video Bad Apple pada peranti luaran (video dengan demonstrasi ).


Sumber: opennet.ru
