組み込みシステムの開発者であり、余暇には BOSS (BEAM ベースのセキュリティ付きオペレーティング システム) オペレーティング システムの開発を行っているアンナ アントネンコ氏が、ヤマハ PSR-E433 ミュージック シンセサイザーのリバース エンジニアリングの結果を公開しました。実行された作業中に、難読化されたシェル インターフェイスがシンセサイザー内で特定され、ファームウェア レベルでコードの実行を組織化できるようになりました。シェル インターフェイスには、SysEx メッセージを含む MIDI パケットを送信することでアクセスします。このメッセージは、シンセサイザーが USB 経由で接続されているときに送信できます。リバース エンジニアリング中に取得したチップとファームウェアに関する情報、コード サンプル、デバッグ ダンプは、GitHub に投稿されます。
アンナがシンセサイザーの内部を埃から掃除し、同時に装置の内部を見たいという好奇心を満たすことに決めた後、数年前にリバース エンジニアリングへの関心が生まれました。このボードには YAMAHA SWL01U チップが搭載されていましたが、インターネット上で詳細な情報を見つけることができませんでした。数か月前、アンナは、このチップのピン配置が含まれている、同様のシンセサイザー モデルのマニュアルを見つけました。アンナは再びデバイスを分解し、JTAG デバッグ インターフェイスと UART ポート用にボード上で利用可能なピンを使用して実験を開始しました。

OpenOCD デバッガを使用し、JTAG に接続して実験したところ、ボードが ARM7TDMI プロセッサ コアを備えたチップを使用していることがわかりました。デバッガでメモリ レイアウトを調査した結果、ROM およびフラッシュ メモリにあるファームウェアの内容をアンロードすることができました。次に、Ghidra リバース エンジニアリング パッケージを使用してファームウェア イメージを分析しました。
ファームウェアから抽出された文字列データを表示しているときに、シェル コマンドに似た一連の行 (「help」、「info」、「ver」、「logout」など) に気づきました。これらの行へのポインタを調べると、ログイン インターフェイスやコマンド シェルを思わせる、コマンドを処理する関数を呼び出すコードが明らかになりました。また、シェルを起動するには「login」コマンドが用意されており、これにパスワード「#0000」を渡す必要があることも明らかになった。 void shell_run_command(char* command_input) { if (shell_login_state == 0) { if (shell_compare_command(command_input, "login") == 0) {shell_ask_passwd(); // 「パスワード?」を出力します。 " シェル_ログイン_状態 = 1; } } else if (shell_login_state == 1) { if (shell_compare_command(command_input, "#0000") == 0) {shell_login_ok(); // 「ログイン OK」を出力しますshell_login_state = 2; } else {shell_print("パスワード エラー\r");シェル_ログイン_状態 = 0; } } else { // 実際にコマンドを実行します } }
ファームウェアをさらに調査したところ、コマンドは常に同じ 8 バイトのデータで始まり、コード 0xf7 で終わるバッチで処理されることがわかりました。シンセサイザーとの外部対話は MIDI を介してのみ実行され、MIDI 仕様では特別なサービス タイプの SysEx メッセージが提供されているため、これをコマンドの送信に使用できると想定されていました。推測をさらに強化するのは、シェルによって解析された SysEx メッセージとパケットが単一のコード 0xf0 で始まり、その後にメーカー ID 0x43 (ヤマハ) が続くということでした。
仮説を検証するために、入力データを MIDI プロトコル パケットに変換する Python スクリプトが作成されました。そして、この方法はうまくいきました:login passwd? #0000 ログイン OK > ヘルプ ログアウト ヘルプ ? 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英語を選択 >
「help」コマンドを送信するときに表示されるプロンプトには、メモリの内容を変更するためのコマンドなどが含まれていました。これらのコマンドを使用すると、任意のコードをメモリにロードし、コマンド処理の完了後に返されるために使用されるスタック上のポインタを置き換えて、そこに制御を移すことができました。実験として、アセンブリ言語で書かれた単純なアプリケーションを未使用のメモリ領域に配置し、文字列「HeloWrld」を 8 文字の LCD インジケータに出力しました。プログラムは通常の MIDI ファイルとしてフォーマットされており、デバイスに転送するだけで済みます。

その後、LCD ディスプレイ上のグラフィックス出力の機能の研究が開始され、外部デバイスでの Bad Apple ビデオの再生と同期して、文字領域に任意のピクセル コンテンツを出力するコードの準備が完了しました (デモ付きビデオ) )。


出所: オープンネット.ru
