Yamaha 合成器中的隱藏指令 shell,允許透過 MIDI 執行程式碼

Anna Antonenko 是嵌入式系統開發人員,她在業餘時間開發了 BOSS(基於 BEAM 的安全作業系統)作業系統,並發表了對 Yamaha PSR-E433 音樂合成器進行逆向工程的結果。在進行的工作過程中,在合成器中識別出了一個混淆的 shell 接口,這使得在韌體層級組織其程式碼的執行成為可能。透過發送包含 SysEx 訊息的 MIDI 封包來存取 shell 接口,當合成器透過 USB 連接時可以傳輸這些訊息。有關逆向工程過程中獲得的晶片和韌體的資訊以及程式碼範例和調試轉儲均發佈在 GitHub 上。

幾年前,安娜決定清除合成器內部的灰塵,同時滿足她想要看到設備內部的好奇心,之後,人們對逆向工程產生了興趣。該主機板包含YAMAHA SWL01U晶片,在網路上無法找到有關該晶片的詳細資訊。幾個月前,安娜發現了一本類似合成器模型的手冊,其中包含該晶片的引腳排列。 Anna 再次拆解了設備並開始實驗,使用板上的 JTAG 調試介面和 UART 連接埠可用的引腳。

Yamaha 合成器中的隱藏指令 shell,允許透過 MIDI 執行程式碼

使用OpenOCD調試器,連接JTAG進行實驗,發現板子採用了ARM7TDMI處理器核的晶片。研究了調試器中的記憶體佈局後,我們能夠卸載位於 ROM 和閃存中的韌體內容。然後使用 Ghidra 逆向工程包分析韌體映像。

在查看從韌體中提取的字串資料時,注意到一組行(“help”、“info”、“ver”、“logout”等)類似於 shell 命令。檢查這些行的指標揭示了呼叫函數來處理命令的程式碼,讓人想起登入介面和命令外殼。據透露,要啟動 shell,提供了「登入」命令,您需要向該命令傳遞密碼「#0000」。 void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) { shell_ask_passwd(); } // 印出“密碼? “ shell_login_state = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) { shell_login_ok(); // 列印「登入成功」 shell_login_state = 2; } else { shell_print("密碼錯誤\r"); shell_login_state = 0; } } else { // 實際執行指令 } }

對韌體的進一步檢查表明,命令是批量處理的,始終以相同的 8 位元組資料開始,以代碼 0xf7 結束。由於與合成器的外部互動僅透過 MIDI 進行,並且 MIDI 規範提供了 SysEx 訊息的特殊服務類型,因此假設這可以用於傳輸命令。進一步加強猜測的是,shell 解析的 SysEx 訊息和封包以單一代碼 0xf0 開頭,後面跟著製造商 ID 0x43 (Yamaha)。

為了測試這個假設,我們編寫了一個 Python 腳本,將輸入資料轉換為 MIDI 協定資料包。此方法有效:登入密碼? #0000 登入確定 > 幫助登出幫助? info ver stack perf-on perf-off perf-disp d dp d xxxxx d/s xxxxx m 位址資料 m/b 位址資料 m/w 位址資料 m/l 位址資料 > info DevelopName PSR-E433 DevelopNumber #3341 Main DevelopNumber # 3341 製作資料與時間16 年2012 月19 日00:57:XNUMX J/E選擇英文 >

發送「幫助」命令時顯示的提示包括更改記憶體內容的命令等。使用這些命令,可以將任意程式碼載入到記憶體中並將控制權轉移給它,從而替換堆疊上用於在命令處理完成後返回的指標。作為實驗,用彙編語言編寫的簡單應用程式被放置在未使用的記憶體區域中,該區域將字串「HeloWrld」輸出到 8 字元 LCD 顯示指示器。該程式被格式化為常規 MIDI 文件,只需將其傳輸到設備即可。

Yamaha 合成器中的隱藏指令 shell,允許透過 MIDI 執行程式碼

此後,開始研究 LCD 顯示器上圖形輸出的特性,最終編寫了將任意像素內容輸出到字元區域的程式碼,與外部裝置上播放 Bad Apple 影片同步(帶有演示的影片) )。

Yamaha 合成器中的隱藏指令 shell,允許透過 MIDI 執行程式碼
播放視頻


來源: opennet.ru
為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster