Upgrade to Pro — share decks privately, control downloads, hide ads and more …

自作バイナリを動かす「入口」8選

 自作バイナリを動かす「入口」8選

Okayama Revengers LT 大会
第7回「涼しゅうなってきたけぇ、そろそろLTするかぁ!」

Avatar for Takumi Sueda

Takumi Sueda

October 11, 2026

More Decks by Takumi Sueda

Other Decks in Technology

Transcript

  1. 自己紹介 末田 卓巳 Takumi Sueda @puhitaku • 岡山県出身 → 千葉

    → 東京 → 岡山 • ものづくり屋の個人事業主 • セキュリティキャンプ講師 • 執筆: 日経 Linux、WEB+DB PRESS 趣味 • リバースエンジニアリング • 低いレイヤーで遊ぶ • DIY: 3D プリント、木工, etc. 2
  2. 入口 #1 内部ストレージを直接書き換える SoC やマイコンの内外に書いてあるプログラムを電気的に直接書き換え る方法。 • 内部 Flash: JTAG

    等で書き換える。アンチタンパリング機能で塞が れていることもある • NAND/NOR Flash: 最も一般的。IC クリップやはんだ付けでROM ライターを接続し読み書きするほか、JTAG も使える • eMMC, SD: 配線にはんだ付けし SD カードリーダーか ROM ライ ターを繋ぐ • USB メモリ: パソコンに挿せば Mass Storage として読める 基板上のストレージの電源ラインを切って電源を吸われないようにする か、SoC のクロックを止めて電源だけ流させる等の工夫が通常必要。 9
  3. 入口 #2 隠れた起動順序を使う 「OS の入った eMMC が内蔵されていて、SD カードスロッ トが備わったデバイス」で主に有効。 SoC

    から見れば SD と eMMC は同じペリフェラル(入出 力)で読み書きするほぼ等価のデバイス。リセットを抜けた 後の起動順序に eMMC が選択されていると、eMMC より 前に SD を読みに行くケースがある。 例えば知育タブレット「すみっコパッド」(右図)の場合、 SD に OS イメージを書いて差し込み起動するだけで自力ビ ルドのブートローダーとカーネルが動かせる。 11
  4. 入口 #3 13 内部ストレージを動作不可にする 当然ながら、ブートローダーやカーネルが入ったストレージ が読み取れなければ SoC は起動を継続できない。 本来読めるはずのストレージが読めなかった場合、起動シー ケンスの段階に応じて様々な現象が起きる(SoC

    によって異 なる)。その結果好きなバイナリを流し込む口が開く場合が ある。 • Boot ROM(リセット直後): USB リカバリーが起動する • ブートローダー (U-Boot): Shell にフォールバックして好 • きなコマンドが呼び放題になる eMMC のクロックに接続されたピンを カーネル (Linux): initramfs で停止 GND に落とし動作を止めている様子
  5. 入口 #4 15 ブートローダーを騙して自作バイナリを起動させる ガジェットの製造時の書き込みや修理対応のために、SD カード等の外部ストレージに所定の置き方でバイナリを置く とそれを認識して実行するような機能がブートローダーに実 EDSAxEXE.BIN 装されていることがある。 NK

    image ヘッダ 例えば電子辞書 SHARP Brain の場合、Windows CE の ブートローダーが認識できる形式の "EDSAxEXE.BIN" とい うファイルを置くとそれを起動する。 u-boot.bin (.text) つまり、U-Boot や Linux のバイナリをその形式に偽装して SD カードに置くと… EDSAxEXE.BIN の構造
  6. 入口 #5 17 ブートローダーの TFTP アップデート機能を使う 無線ルーターなどのネットワーク機器でよく使われる方法。 ブートローダーの起動ログに「〇〇キーを押すと TFTP download

    を実行する」などと表示されていれば使える。 TFTP は FTP のようにパス指定が可能だが極めてシンプル に削ぎ落としたプロトコルで、ブロックに分割したファイル の送受信ができる。 機器側が TFTP client になる場合と TFTP server になる場 合があり、それに応じて開発マシンに client か server を立 ててバイナリを送り込む。 TFTP で U-Boot を送りつけたら 誤って画面の絵が格納されている箇所に書いてしまい バイナリが意図せず「可視化」された時の画像
  7. 入口 #6 19 ブートローダーの設定をいじる OS が起動した後、ブートローダーの設定が書かれている箇 所を好きに読み書きできる場合に利用可能な方法。 U-Boot の場合は env

    という領域に起動時に実行されるコマ ンド列が書かれていて、bootcmd という値をいじれば起動 時の流れを変えられる。CRC チェックが走る場合が多いの で、その場合は CRC も書き換える必要がある。 なお古い Android 等では DirtyCoW などで root 権限を奪 取すれば好きにストレージが書けるためこの方法が活きる。 ※ DirtyCoW は立派な脆弱性で悪用厳禁!!自分が所持す るデバイスでのみ行うこと!! 同手法を使い、進研ゼミ「チャレンジパッド」で Debian の動作に成功した時の様子
  8. 入口 #7 21 DRAM に置いてジャンプする Windows CE や RTOS など、特権命令が気軽に呼べるおお

    らかな環境で有効な方法。 ジャンプとは、プログラムカウンタ(CPU が次に解釈し実行 するアドレス)を書き換えること。DRAM にブートローダー 等を置いてその先頭にジャンプすれば、元のカーネルを脱出 して好きなものが実行できる。 ジャンプ先のバイナリは「起動初期の物理アドレス空間に対 する絶対アドレス配置」を想定しているため、割り込みを無 効化し、キャッシュをクリアし、MMU を切り、事前に決め た位置に正確にジャンプする。これらには特権が必要。 電子辞書 SHARP Brain にて 同手法で U-Boot を起動する瞬間の様子
  9. 入口 #8 23 BOF 等を利用しシステムを改変する バッファの境界を無視した書き込みを行ってしまうなどのバグを抱えた プログラムを見つけた場合に有効な方法…だが、脆弱性として扱い報告 すべき対象であることも多いので推奨しない。ここではあくまで技術的 興味として紹介する。 ゲーム機の

    PS3 で発見された "PSJailbreak" は、起動時に USB で 巨大な USB descriptor を流し込んで関数ポインタを書き換え、カー ネル内の一部処理にパッチを当てるコードを実行させ、未署名のバイナ リを実行可能にした。 このほか、Apple A シリーズの Boot ROM に存在した USB 関連の use-after-free、Google Nest Hub の U-Boot に存在した USB Mass Storage の BOF などシステム書き換えに至った例は数多い。 高価だった PSJailbreak の安価な再実装品。 はんだ付け無しでデバッグメニューを有効化できる 同 exploit は当時大変注目された Minimus AVR USB PSGroove - PS3 Homebrew and Backups - PSJailbreak by RetroGameTech www.youtube.com/watch?v=wIhXu6qu9qM
  10. おわりに 24 本日紹介した「入口」一覧 1. 内部ストレージを直接書き換える 2. 隠れた起動順序を使う 3. 内部ストレージを動作不可にする 4.

    ブートローダーを騙して自作バイナリを起動させる 5. ブートローダーの TFTP アップデート機能を使う 6. ブートローダーの設定をいじってブートシーケンスを捻じ曲げる 7. DRAM にカーネルやブートローダーを置いてジャンプする 8. バッファオーバーフロー等を利用しシステムを改変する