たのしいバイナリの歩き方
この本の概要
「シューティングゲームをチートから守るには?」
「リバースエンジニアリングされないためには?」
「脆弱性を見つけ,権限を奪取するには?」
普通のプログラミングだけでは意識しない低レイヤーの世界は,コンピュータを自在に操れる楽しさでいっぱい。アセンブラの読み方から最新の応用事例まで,技術と考え方が実例を通じてわかります。
こんな方におすすめ
- コンピュータの仕組み/低レイヤーに興味がある方
- セキュリティに興味のある方
目次
第1章 リバースエンジニアリングでバイナリの読み方を身につける
1.1 まずは解析の流れを体感してみよう
- 安全に解析できる環境を作る
- 解析に必要な3つのツール
- プロセスモニターのログから挙動を確認する
- レジストリへのアクセスから読み取れること
- リバースエンジニアリングとは
- コラム リバースエンジニアリングの技術力を競う大会
1.2 静的解析をやってみよう
- 静的解析と動的解析
- コラム StirlingとBZエディタの違い
- バイナリエディタでファイルの中身を眺めてみる
- アセンブラを読めなくても解析はできる
- ソースコードがない状態から動作を把握する
- 逆アセンブルされたソースコードを確認する
1.3 動的解析をやってみよう
- Process Monitorのフィルタルールを設定する
- デバッガの役割とは
- OllyDbgでより詳細な動作を見極める
- 逆アセンブルされた処理を分析する
- コラム レジスタとは
- 解析結果とソースコードを見比べる
- コラム 好みのデバッガを選ぼう
1.4 最低限のアセンブラ命令だけざっくり把握する
- すべてのアセンブラ命令を覚える必要はない
- アセンブラではどのように条件分岐が実現されているのか
- 引数はスタックに積まれる
- アセンブラからC言語のソースコードをイメージできるか
1.5 アセンブラ命令から動作を把握しよう
- 関数にブレイクポイントをセットする
- 逆アセンブルして重要な部分を見ていく
- コラム アセンブラを書こう
第2章 シューティングゲームをチートから守るには
2.1 メモリダンプを読み解く
- シューティングゲームのルール
- たった4バイト書きかえるだけで高得点に
- メモリダンプを取得するには
- プロセスが異常終了した瞬間の状態からクラッシュの原因を探る
- Just-In-Timeデバッグを有効にするには
- ダンプファイルから原因の手がかりを見つける
- コラム パソコン以外のコンピュータを解析することはできるのか
- コラム Java製アプリを解析するには
2.2 動作を解析されないようにするには
- アンチデバッギングの手法
- コラム デバッグを検知するさまざまな手法
- コードを難読化して解析されるのを防ぐ
- コラム 難読化に関する話題
- 実行ファイルを実行できる状態のまま圧縮する
- 圧縮された実行ファイルを展開する ~アンパック
- UPXを手動でアンパックして仕組みを理解する
- ハードウェアブレイクポイントを使ってASPackをアンパックする
- コラム .NET製アプリを解析するには
第3章 ソフトウェアの脆弱性はこうして攻撃される
3.1 バッファオーバーフローを利用して任意のコードが実行される仕組み
- バッファオーバーフローが起こるプログラムの例
- 一般ユーザーが所有者権限でプログラムを実行する仕組み
- どのようにして権限は奪われるのか
- スタックにおけるメモリの使われ方
- こうして攻撃者が用意したコードは実行される
- gdbでコードが実行されてしまう状況にあることを確認する
- 攻撃用コードの例
- shellcodeとして使えるマシン語コードを生成する
- 0x00を使わないように改良する
- コラム printf系関数に起因するフォーマットストリングバグ
3.2 攻撃を防ぐ技術
- アドレスをランダムに決定する ~ASLR
- 実行コードが置かれるメモリ空間以外には,極力実行権限を持たせない ~Exec-Shield
- スタックが破壊されたことを検知するマシン語をコンパイル時に挿入する ~StackGuard
3.3 セキュリティ機能を迂回する技術
- libcの中にある関数を利用して攻撃する ~Return-into-libc
- ランダム化されていないモジュール内にあるアセンブラコードを使って攻撃する ~ROP
- コラム セキュリティがいたちごっこになる理由
第4章 処理を自在に実行させるプログラミングのテクニック
4.1 デバッガを自作して動作を理解する
- 「かんたんなものを作ってみる」ことでたのしく理解を深める
- デバッガはどのような仕組みになっているのか
- 逆アセンブラを実装する
- 改良したデバッガを実行してみる
4.2 他プロセス内で任意のコードを実行させる ~コードインジェクション
- 他プロセスへコードを注入させる3つの方法
- SetWindowsHookExでOSのシステムメッセージをフックする
- レジストリのAppInit_DLLsにDLLのパスを登録しておく
- CreateRemoteThreadで他プロセス内にスレッドを生成する
- 関数を挿入する
4.3 処理を任意のものに置きかえる ~APIフック
- APIフックの2つのタイプ
- DetoursでかんたんにAPIフックを実現
- メッセージのタイトルを変えて動作を確認してみる
- コラム 「ハッキングらしい」技術の象徴がDLLインジェクションとAPIフック?
第5章 ツールを駆使してより深い世界へ
5.1 Metasploit Frameworkで脆弱性を検証/調査する
- Metasploit Frameworkとは
- 脆弱性情報はどこで手に入るのか
- Exploitを試す環境を作る
- 脆弱性を突いてみる
- コラム shellcodeをもっと勉強したいならば
- ROPの実例を見る
5.2 EMETでROP対策の仕組みをのぞく
- EMETとは
- Anti-ROPのアイディアはBlueHat Prizeで入賞したもの
- いかにして攻撃を防ぐか
- ローダーの処理を把握する
- DLLはどのような処理をしているのか
- CALL-RETNをチェックする
- どうやって誤検知を防ぐか
- スタックの正当性をチェックする
5.3 REMnuxでマルウェアを解析する
- REMnuxとは
- パターンデータベースを更新する
- ディレクトリをスキャンする
5.4 ClamAVでマルウェアやExploitを検知する
- ClamAVのパターンファイルの特徴
- .cvdファイルを展開してみる
- 検知したファイルの詳細を知る
- 使われているパッカーやマルウェアらしいものを検出する
5.5 Zero Wine Tryoutsでマルウェアを解析する
- REMnuxとZero Wine Tryoutsの違い
- 動作の仕組み
- ユーザーインターフェースを表示させる
- 解析レポートの情報を確認する
- コラム 自分でツールを開発してみよう
5.6 人の手による解析を極力減らすには ~ヒューリスティック技術
- 1日平均で60000個のマルウェアに対応する限界
- ヒューリスティック技術というイノベーション
- 2つのマルウェアでテストしてみると
Appendix
A.1 IDAをインストールする
A.2 OllyDbgをインストールする
A.3 WinDbgをインストールする
A.4 Visual Studio 2010をインストールする
A.5 Metasploitをインストールする
A.6 解析ツール
- Stirling/BZエディタ
- Process Monitor
- Process Explorer
- Sysinternalsツール
- うさみみハリケーン