Slide 1

Slide 1 text

学校では教えてくれない リバースエンジニアリングのススメ

Slide 2

Slide 2 text

about me 2001年度 第三学群情報学類入学(AC入試第二期) ◦ AC入試の提出資料:PHS用の着メロサイトの運営、MIDI→着メロファイルのコンバータ等 2003年 留年 2004年 休学 2005年 学生ベンチャー「ニューフォレスター」 スタートアップメンバー なんやかんや 2009年 復学、ようやく卒業 現勤務先:株式会社エーディエス(柏市) ソフトウェア開発、植物工場監視システム 趣味:リバースエンジニアリング関係の同人誌出版、ライター(ラジオライフ)

Slide 3

Slide 3 text

アンケート#1 Q1 あなたは「リバースエンジニアリング」を ◦ 知っている、他の人になんとなく説明できる ◦ やったことがある ◦ この授業で初めて聞いた Q2 自分の持っている家電、パソコン、スマホ、オーディオを ◦ 分解したことがある ◦ 分解したことがない

Slide 4

Slide 4 text

リバースエンジニアリングとは 成果物(製品)から技術を推測すること ◦ 観察:本体をブラックボックスとして入出力を観察する ◦ 必要に応じて、不適合入力を与えてエラーを調べる ◦ 分解 ◦ 装置を分解して、構造から仕組みを調べる ◦ 基板から部品を取り外して回路図を書く ◦ ソフトウェアの分析 ◦ ファームウェアを解析する ◦ 逆コンパイル、逆アセンブル

Slide 5

Slide 5 text

リバースエンジニアリングでできること① ・機械・製品の仕組み、製造方法を知ることができる ・DOOMを動かすことができる ◦ 世界中のリバースエンジニアリングマニアは、ディスプレイが付いた機械を見ると DOOM(一人称シューティングゲーム)を動かしたい衝動に駆られる デジカメ ATM オシロスコープ

Slide 6

Slide 6 text

リバースエンジニアリングでできること② リバースエンジニアリングで得られた情報をもとに ◦ 操作性向上:便利な機能を追加したりする ◦ リソースハック:画面の文字や画像を入れ替える ◦ CFWを作ってほかの人と共有することができる ・OpenWRT:無線LANルータのカスタムファーム ・OpenIPC:WiFiカメラのカスタムファーム ◦ Clone製品を作ることもできる ◦ パチモン

Slide 7

Slide 7 text

リバースエンジニアリングでできること③ リソースなどから開発中の試行錯誤の残骸などを見つけ、苦労を偲ぶ 開発者からのメッセージを見つけることもある

Slide 8

Slide 8 text

見ちゃいけないものを見つけることもある 脆弱性、バックドア ◦ 見つけたらIPAに報告しよう ◦ 開発者に情報提供をして、一定期間の対処期間の後、周知したりしてくれる 残っていないはずの大量の顔写真

Slide 9

Slide 9 text

アンダーグラウンドなイメージがある? ・法律上、禁止されていない ・「分解禁止」→あくまでもメーカサポートの対象の話 ・個人の所有物なので自由である ◦ 他人に迷惑をかけないことは必要 ◦ 電波法→分解することで、認証の基準から外れることがある ◦ 電安法(PSE)→認証時の状態と違うものを販売してはいけない ・禁止行為:リバースエンジニアリングしたものをそのまま使う→著作権法 ・秘密の流出・損害を与えてはいけない→損害賠償

Slide 10

Slide 10 text

ダメって書いてあるじゃん • あくまでもソフトウェアの使用に関する契約の話 • 個別の事案については裁判してみないとわからない→判例もない • 秘密はそっとしておいた方がいい • →分解してわかる程度のことは公知とされることもある

Slide 11

Slide 11 text

ダメじゃない部分もある 製品内にOSS由来の部分がある場合、その部分はOSSのライセンスに従う ここは胸を張ってやっちゃって構わない

Slide 12

Slide 12 text

アンケート#2 OSSについて ◦知っている ◦聞いたことはある、なんとなくイメージできる ◦いま初めて聞いた Linuxについて ◦知らない、触ったことがない ◦まぁ使ったことがある ◦チョットデキル

Slide 13

Slide 13 text

Open Source Software 略してOSS ・オープンソース = ソースコードが公開されている ・ソースコードがオープンだからって好き勝手していいわけではない ・いくつかのライセンスパターンがある ◦ GPL、LGPL ーー越えられない壁ーー ◦ MIT ◦ Apache ◦ BSD ◦ などなど

Slide 14

Slide 14 text

組み込みネットワーク機器には Linuxがよく使われる ◦ オープンソース ◦ ネットワーク機能 ◦ SoCメーカ、基板開発メーカーがSDKとセットで出している それ以外のものもたまにある ◦ FreeBSD ◦ iTRON ◦ FreeRTOS ◦ そのほか、ベアメタル(OSレス)等 ・ネットワークルータ ・ポケットWiFi ・ネットワークカメラ ・カラオケ機 ・TV(AndroidTV) ・高級なネットワーク機器 ・Nintendo Switch ・高級なネットワークカメラ ・ ・大変安価なWiFiカメラ

Slide 15

Slide 15 text

GitHubは聞いたことあるよね? ・オープンソースソフトウェア用のリソース置き場所 ・多くのソフトが公開されている ◦ Clone:自分の手元にコピーして利用する ◦ Fork:派生させて再利用する ・公開時にライセンスを設定できるので、その範囲で使用する必要がある ◦ 要求事項 ◦ ソースの公開の必要性 ◦ 著作権表記 ◦ それぞれは各自調べて

Slide 16

Slide 16 text

GPLだけ別格 ・GPLのソースコードを使用した製品を頒布した場合、頒布された者がソースコードを請求した 場合、開示しなければならない(ざっくり) ・GPLと関係ない部分は開示しなくていい ・開示したくない部分は静的リンクしないように工夫する必要がある ・LinuxはGPL ◦ 製品のOSとしてLinuxを使用(多くの場合、それぞれのCPUや基板に合わせてカスタムする必要がある ため、ソースコードに変更が加えられることがほとんど)した場合、製品を買った人は、そのソースコー ドを請求できる ・Linux以外のいろいろなOSSが組み込み機器の中に使われている ◦ 権利者表記をいろいろなところで見ることができる ◦ アプリのメニュー、取扱説明書の後ろの方

Slide 17

Slide 17 text

リバースエンジニアリングのススメ ・Linuxなど、OSSに関する部分は堂々とメーカーにソースコードを請求して、 本体を使ってあれこれいじって遊ぶことができるし、 成果物を発表することもできる ・組み込み機器開発についてよく学ぶことができる ・それ以外の部分もこっそりやって技術を身に付ける分にはまぁ問題ない ・是非やってみよう ◦ 学校ではあまり教えてくれない ◦ 既刊同人誌の電子データを学習用に提供します ・仕事にはならない ◦ セキュリティ会社ならワンチャン

Slide 18

Slide 18 text

実例:ファミコンミニ ・手のひらサイズのTVにつなぐとゲームができる 任天堂の製品 ・ファミコンはみんな知ってる…? ◦ ROMカセットを本体に挿すと、 CPUと接続されてゲームを遊ぶことができる ・この仕組みを、メニューから選ぶことで表現して いる ・メーカーが選んだ30本 ◦ 差し替え不能→もったいない!

Slide 19

Slide 19 text

分解する お手元の基板をご覧ください ◦ SoC(System on Chip)いわゆるCPU Allwinner(台湾) R16 ◦ RAM ◦ eMMC (embedded Multi Media Card) いくつかの配線されていないパッド(丸い端子)がある ◦ 配線されていないパッドは、テストパッドなどとも呼ばれて、 開発の段階では使用されていたり、検査のためなどに使われている この中に、「UART」パッドがある

Slide 20

Slide 20 text

UART(非同期シリアル)通信端子 ・開発中やログ出力等のためにつけられていて、 製品としては使用されないが、削除されずに残っていることが多い ・Linuxなどの組み込みOSでは、対人インターフェイス(CUI)として使用されるこ とが多い。 が、製品版ではその機能が削られていることが多い。 ・でも、特殊な操作をするとCUIとして使用できることもある ・ログ出力だけでも動作解析のヒントとなる ・基板を分解したら真っ先に探すこと

Slide 21

Slide 21 text

UART端子の見つけ方 3本、または4本まとまった端子があれば、高確率でUART端子 ◦ そうでないこともある オシロスコープのプローブを当てて、電源を入れたり切ったりする 運がいいと、シリアル出力端子を見つけることができる もっと運がいいと、基板に文字で書いてある ◦ TX:出力、RX:入力

Slide 22

Slide 22 text

UART端子とPCを接続する • USB-TTL(CMOS) シリアルコンバータ • Amazonで1000円ぐらいで買える • 引き出しに常備しておくといい • 機器の電圧によってはCMOS(3.3V),LVTTL(1.8V)のもの • ビットレートは最近の機器なら115200bps、 古いものなら38400や9600 • WindowsならTeraTermがおすすめ Mac、Linuxなら • > screen /dev/ttu.usbxxx 115200

Slide 23

Slide 23 text

ファミコンミニのシリアル出力を見てみる 何か、が表示されるけど それ以上何も出ない HDMIにはゲーム画面が出ている 「U-Boot」という表示が出ている U-Bootという、ARM系のCPUで Linuxを呼び出すためのブートローダが動いてい る

Slide 24

Slide 24 text

U-bootのソースコードを見てみる • s を押しながら電源を入れると デバッグモード(CUI)に入れる • これ以外の機器も似たような動きを するものが多い(キーは違う) mbr not exist base bootcmd=sunxi_flash phy_read 43800000 30 20;boota 43800000 bootcmd set setargs_nand key 0 cant find rcvy value cant find fstbt value no misc partition is found to be run cmd=sunxi_flash phy_read 43800000 30 20;boota 43800000 WORK_MODE_BOOT board_status_probe [ 0.580]key trigger [ 0.582]Hit any key to stop autoboot: 0 clover#

Slide 25

Slide 25 text

Linuxの起動パラメータを変更する U-Bootのデバッグシェルではいろいろなコマンドが使える setenv (環境変数の設定) で cmdline 変数を書き換えると Linuxの起動パラメータが変更できる ◦ →起動するプログラムや挙動を無理やり変更できる ◦ カーネルコンパイルオプションで無効化することもある 起動パラメータに init=/bin/sh を付けると ◦ 本来呼び出されるinitプログラムの代わりに、単純シェルが起動して パスワードなどが不要な最小限のCUIが手に入ってしまう シェルとしての実体は「busybox」という実行ファイル

Slide 26

Slide 26 text

Busyboxとは 組み込みLinuxでよく使われる各種アプレットの詰め合わせ ◦ GPL Linuxでよく使われるコマンド群が入っているが、 コンパイルオプションで外すことが可能 当然、量産機器では最小限になっていて、 必要なコマンドが入っていないこともある その場合は、自分でソースからビルドして使うことができる

Slide 27

Slide 27 text

よく使うコマンド hexdump hexdump –C ◦ ファイルの16進ダンプを得る

Slide 28

Slide 28 text

よく使うコマンド strings strings ◦ 実行ファイルなどのバイナリファイルに 含まれる可読文字列を拾う

Slide 29

Slide 29 text

よく使うコマンド dd dd if= of= ◦ フラッシュメモリなどからファームウェアを吸い出す ◦ ファイルを特定オフセットから必要バイト数切り出す ◦ ゼロで埋めたファイルをつくる ◦ などなど

Slide 30

Slide 30 text

ファームウェアを吸い出す ・Linuxにログインできるならddコマンドで吸い出す ・DFUツールで吸い出す(Allwinner,Rockchip等) ・SPI Flashのピンに配線して、 ROMリーダで吸い出す eMMC とCPUの間の配線に割込み、1ビットモードで吸い出す

Slide 31

Slide 31 text

eMMC を無理やり読み取る eMMCはBGAパッケージ(部品の底面に端子がある) そのままでは端子にアクセスすることができない しかし、基板の配線パターンをよく見ると、 CPUまで配線が伸びていることがある 全部の配線がわからなくても、 RST,CLK,D0,C/Sの配線さえわかれば、 1ビットモードで読み取ることができる SDカードリーダーへ接続

Slide 32

Slide 32 text

基板上の信号を横取りする ・金色のところは電気を通す はんだを載せて部品を付ける ・緑色のところは「レジスト」という コーティングがされている ・信号を横取りするために表面を薄く削る ・細い配線材「UEW」をはんだ付けする

Slide 33

Slide 33 text

ファームウェアが取り出せたら 中身を解析する ◦ ブートローダ ◦ 環境変数 ◦ Linuxカーネル ◦ ルートファイルシステム ◦ アプリ、データ ◦ binwalkコマンドが便利。binwalkでファイルシステムのオフセットを確定したら、 ◦ mountコマンドでマウントできる(こともある) アプリを逆コンパイルして調べる

Slide 34

Slide 34 text

よく使うコマンド binwalk / file ・file ・binwalk ◦ -e オプション:判別されたデータブロックをファイル化する ◦ -eM : 上記でファイル化された中身も再帰的にファイル化する ◦ -E:エントロピーエッジの抽出 ◦ 暗号化領域は、特に格納されたデータのエントロピー(ランダム率)が高くなる なんでわかるか?「マジックバイト」を見る 慣れればhexdumpすればすぐわかるようになる

Slide 35

Slide 35 text

binwalkコマンドの出力 ATOMCamのファームウェア のファイルを読み込ませてみる ファイルシステムだけにしたい場合 ◦ binwalk -y filesystem

Slide 36

Slide 36 text

先頭部分とfileコマンドの出力例 PE32 executable (console) Intel 80386, for MS Windows JPEG image data, JFIF standard 1.01, resolution (DPCM), density 56x56, segment length 16, baseline, precision 8, 349x489, frames 3

Slide 37

Slide 37 text

特殊な対策の例 HDDのパーティションテーブルのマジック番号を書き換えてある ◦ 中身はExt3だけど、そこだけ変わっていてマウントできない ◦ 見つけるには経験と勘 一般的なファイルシステムを使わず、独自の構造体を使っている ◦ アプリを解析する必要がある ◦ 勘で 単純な暗号化 ◦ XOR:テーブルを探したり、逆コンパイルしたりする、 ガチガチの暗号化 ◦ 証明書ストアや秘密領域を使って全然読めなくなっている

Slide 38

Slide 38 text

リソースの変更を行う場合 ・スクリプト、設定ファイルなどの変更 ・読み込まれるデータ(この場合ゲームのROMデータ)や ・画像データの変更 ◦ ファミコンミニ用のハックツールがリリースされた ◦ 自分で使う分には問題ない ・改造したものを公開したりすると ◦ 有償・無償は関係ない ◦ 著作権侵害:同一性保持 ◦ 商標権

Slide 39

Slide 39 text

アンケート 実行可能プログラムファイルの中身を ◦ 見てみようと思ったことがある ◦ メモ帳とかで開いたことがある ◦ バイナリエディタで見たことがある バイナリエディタ ◦ 使ったことがある ◦ 使ったことがない

Slide 40

Slide 40 text

バイナリエディタ 普通のエディタでバイナリファイルを開いても、文字化けしか見えない お勧め3選 ・Stirling ◦ 国産バイナリエディタ ・Hex Workshop ◦ 多機能、巨大ファイル編集可能 ・ImHex ◦ 構造体定義機能 ◦ マルチプラットフォーム

Slide 41

Slide 41 text

コンパイルと逆コンパイル 人間が読める CPUが実行する int check(){ time_t timer; struct tm* local; int year; timer = time(NULL); local = localtime(&timer); year = local->tm_year + 1900; if (year > 2023) return 1; return 0; } ソースコード(C言語) アセンブリリスト オブジェクトコード 実行可能ファイル MOV dword ptr [EBP + local_10],EAX MOV dword ptr [EBP + local_c],EDX LEA EAX=>local_10,[EBP + -0xc] PUSH EAX CALL localtime ADD ESP,0x4 MOV dword ptr [EBP + local_14],EAX MOV ECX,dword ptr [EBP + local_14] MOV EDX,dword ptr [ECX + 0x14] ADD EDX,0x76c 4D F0 8B 51 14 81 C2 6C 07 00 00 89 55 EC 81 7D EC E7 07 00 00 7E 07 B8 01 00 00 00 EB 02 33 C0 8B 4D FC 33 CD E8 34 00 00 00 8B E5 5D C3 CC CC 55 8B EC E8 98 FF FF FF 85 C0 74 10 68 24 30 40 00 FF 15 B8 20 40 00 83 C4 04 EB 0E 68 18 30 40 00 FF 15 B8 20 40 00 83 C4 04 33 C0 5D C3 3B 0D 04 30 40 00 75 01 C3 E9 79 02 00 00 56 6A 01 E8 4D F0 8B 51 14 81 C2 6C 07 00 00 89 55 EC 81 7D EC E7 07 00 00 7E 07 B8 01 00 00 00 EB 02 33 C0 8B 4D FC 33 CD E8 34 00 00 00 8B E5 5D C3 CC CC 55 8B EC E8 98 FF FF FF 85 C0 74 10 68 24 30 40 00 FF 15 B8 20 40 00 83 C4 04 EB 0E 68 18 30 40 00 FF 15 B8 20 40 00 83 C4 04 33 C0 5D C3 3B 0D 04 30 40 00 75 01 C3 E9 79 02 00 00 56 6A 01 E8 Cスタートアップコード ヘッダ等(MZ,ELF,….) 外部ライブラリへの参照 コンパイル 逆コンパイル Linux ELFファイルなら readelf –a <実行ファイル> で情報を見れる

Slide 42

Slide 42 text

リバースエンジニアリングツール「Ghidra」

Slide 43

Slide 43 text

完全に元には戻らないけども int __cdecl check(void) { tm *ptVar1; uint uVar2; undefined8 local_10; local_10 = time((time_t *)0x0); ptVar1 = localtime(&local_10); uVar2 = (uint)(0x7e7 < ptVar1->tm_year + 0x76c); return uVar2; } int check(){ time_t timer; struct tm* local; int year; timer = time(NULL); local = localtime(&timer); year = local->tm_year + 1900; if (year > 2023) return 1; return 0; } 元のソースコード 逆コンパイルされたコード 2024年になると実行できなくなるソフトウェアに含まれそうなソースコードの例 4D F0 8B 51 14 81 C2 6C 07 00 00 89 55 EC 81 7D EC E7 07 00 00 7E 07 B8 01 00 00 00 EB 02 33 C0 8B 4D FC 33 CD E8 34 00 00 00 8B E5 5D C3 CC CC 55 8B EC E8 98 FF FF FF 85 C0 74 10 68 24 30 40 00 FF 15 B8 20 40 00 83 C4 04 EB 0E 68 18 30 40 00 FF 15 B8 20 40 00 83 C4 04 33 C0 5D C3 3B 0D 04 30 40 00 75 01 C3 E9 79 02 00 00 56 6A 01 E8

Slide 44

Slide 44 text

逆コンパイル結果をもとに ソースコードを見ながら動作と突き合わせて仕組みを解析する 逆アセンブルリストをもとに、機械語命令を変更することができる 0040105a 89 45 f4 MOV dword ptr [EBP + local_10],EAX 0040105d 89 55 f8 MOV dword ptr [EBP + local_c],EDX 00401060 8d 45 f4 LEA EAX=>local_10,[EBP + -0xc] 00401063 50 PUSH EAX 00401064 e8 97 ff CALL localtime tm * localtime(time_t * _Time) ff ff 00401069 83 c4 04 ADD ESP,0x4 0040106c 89 45 f0 MOV dword ptr [EBP + local_14],EAX 0040106f 8b 4d f0 MOV ECX,dword ptr [EBP + local_14] 00401072 8b 51 14 MOV EDX,dword ptr [ECX + 0x14] 00401075 81 c2 6c ADD EDX,0x76c 07 00 00 0040107b 89 55 ec MOV dword ptr [EBP + local_18],EDX 0040107e 81 7d ec CMP dword ptr [EBP + local_18],0x7e7 e7 07 00 00 00401085 7e 07 JLE LAB_0040108e 00401087 b8 01 00 MOV EAX,0x1 00 00 0040108c eb 02 JMP LAB_00401090 LAB_0040108e XREF[1]: 00401085(j) 0040108e 33 c0 XOR EAX,EAX LAB_00401090 XREF[1]: 0040108c(j) 00401090 8b 4d fc MOV ECX,dword ptr [EBP + local_8] 00401093 33 cd XOR ECX,EBP EAX:関数の戻り値を入れるレジスタ

Slide 45

Slide 45 text

バイナリコードを変更すれば 当然動作も変わる アーキテクチャによっては命令長が変わるため、工夫が必要 ◦ NOPで埋める、etc アーキテクチャとは ◦ x86 :一般的なPC ◦ ARM:組み込み向け、Androidスマホ ◦ MIPS:組み込み向け ◦ などなど 開発製品のソースコードを失った際の最後の手段 対策 アプリのハッシュなどを別途保存して 改ざんされていないかなどをチェックする コード署名の機能などを使う

Slide 46

Slide 46 text

ほかの実例:ATOMCam 3000円ぐらいで買えるWiFiカメラ ◦ リアルタイム動画を見るためには メーカー純正の専用アプリが必要 ◦ メーカのAWSサーバを中継しているため ◦ アプリがスマホでしか動かない ◦ SDカードの内容をコピーするのが不便:アプリの使い勝手が悪い アプリに割り込んで画像を横取りするルーチンを作る ◦ リアルタイム画像H264ストリームとしてローカルLANに自由に配信できる ◦ FTPサーバ機能を付けて、SDカードに自由にアクセスできるように ◦ SSHでshellコマンドを実行可能

Slide 47

Slide 47 text

ルーチンを作るといっても ・もともと販売されているカメラのアプリのソースコードはない ・SoCメーカのSDKとカメラのアプリの2つに分かれている ◦ SDKはNDA付きで機器メーカに渡されている ◦ 結構たくさん生産されているものなので、どうしても漏れる ◦ 漏れた資料が、海外の有料会員制サイトなどにアップロードされていることがある ◦ 登録する際はクレジットカード情報を抜かれないように注意しよう ◦ Paypal経由が安心 ・SDKの資料を手に入れた ・アプリを逆アセンブルして資料の補完とした

Slide 48

Slide 48 text

実装方法:LD_PRELOADを使う 自作プログラム (libcallback.so) イメージ センサ メーカー製アプリ SoCメーカー製 SDK コールバック登録 画像が届いたら呼び出して Func set_encode_frame_callback(*pFunc) LD_PRELOAD=libcallback.so を付けてアプリを起動すると ライブラリの検索優先順を変更できる カメラ atomcam_toolsという名前で GitHubに公開されている set_encode_frame_callback(*pFunc)

Slide 49

Slide 49 text

そんな改造していいの? ・起動方法として、メーカが明示していない、u-boot内の開発用の 機能「microSD内に”factory_t31_ZMC6tiIDQN”というファイルがあれ ば、それを読み込んで起動する」という方法を使っている ◦ OSSのソースコードとして公開されているので公知のことではある ◦ メーカが対策することも可能 ・「atomcam_tools」はメーカの方でも認知している ◦ 「対策する予定はない」 ・たまたま、メーカとハッカーの関係性によりそうなっている ◦ これを、「改造ATOMCamです」とか言って売ったら、たぶん怒られる

Slide 50

Slide 50 text

ダメな改造もあった ほかの人が、スマホ版のアプリを解析して、パソコンからAWSの動画中 継サーバにアクセスして動画を見れるようにするアプリを作って公開した ・メーカから公開停止要請 ・違いは? ◦ 購入者が所有する機械の上で動くだけのアプリ、サーバには影響を与えない ◦ サーバに直接アクセスする、秘密鍵はアプリからコピー、そのほか諸々 ・これもたまたま、そうなった ◦ ほかの事例でもここにラインが引かれるとは限らない

Slide 51

Slide 51 text

追加のテクニック Linuxのシェルにログインするパスワードがわからない場合 ◦ init=/bin/sh で限定シェルに入る、ファームウェアを吸い出す ◦ /etc/passwdを書き換える • root:のあとがxの場合:削除してしまう • 短いハッシュが書かれていた場合: • 「HashCat」などのソフトで解析する

Slide 52

Slide 52 text

「HashCat」 GPUを使った総当たり、または辞書方式による逆ハッシュ計算ソフト ◦ /etc/passwd に直接書かれてるいるようなDESハッシュだと、数分~数時間 ◦ /etc/shadowにあるような場合、結構かかるので削除の方が早い

Slide 53

Slide 53 text

同人誌たち ・ファミコンミニ ・プレイステーションクラシック ・Qrio Smart Lock ・検温カメラ ・WiFiカメラ「スマモッチャー」 ・ドコモ フォトフレーム ・レトロアーケード ・呼び込み君