リバースエンジニアリング

はじめに

下記の本を買ったので、覚書程度に内容をまとめる。

メモ

  • 初版2刷を購入
  • 全12章と付録Aで構成
  • Python2.5

1章 開発環境のセットアップ

2章 デバッガの基本原理

  • Debuggerの種類
  • 権限
  • 汎用レジスタ
    • 下記の8個が主なもの
      1. EAX (アキュムレータ)
        • 計算処理、関数の戻り値の格納 => 関数呼び出しの成否が判断できる
      2. EDX (データレジスタ)
        • EAXの拡張
        • 複雑な処理向け(乗算、除算など)
      3. ECX (カウントレジスタ)
        • ループ処理用
        • 下方向のカウント(カウントダウン)
      4. ESI (Source Index)
        • ループ処理に利用
        • 入力データストリームの位置を格納
      5. EDI ( Destination Index)
        • ループ処理に利用
        • データ処理の結果を格納する位置を指すポインタ
      6. ESP (Stack Pointer)
        • Stackの先頭位置
      7. EBP (Base Pointer)
        • Stackのベース(基底), 要は開始位置
      8. EBX
        • 色々使える
  • スタックについて
    • Cとx86アセンブリでの関数呼び出しとその時のスタックフレームについて
    • 関数内で配列をアロケートした場合にスタックがどうなるか
  • デバッグイベント
  • ブレークポイント
    • Software Break Point
      • 一般的な奴
      • 命令とオペコード
    • Hardware Break Point
      • Debug Register(DR), DR0, DR1,...,DR7
    • Memory Break Point
      • Linuxのファイル権限の奴(chmodで変更するアレ)

3章 Windows Debuggerの構築

  • (*手持ちのWindows環境を立ち上げるのが面倒なので、軽く流す)
  • 実際に動くデバッガを構築していく
  • プロセスに対してデバッグを行う場合、プロセスとデバッガを関連付ける必要がある。
    • 下記の2通りのどちらかで行う事になる
      1. デバッガで、実行ファイルを開いて実行する
      2. 実行中のプロセスにデバッガをアタッチする
  • 以降のページで、上記の1,2の場合に於ける実装をしている(略)

4章 PyDbg

  • PyDbgを利用して、3章で作成したプログラムを拡張 & ユーティリティの作成
  • 3章で作成したブレークポイントハンドラの拡張
  • アクセス違反ハンドラの作成
    • アクセス違反の原因
      • アクセス権限の無いメモリ領域にアクセス
      • プロセスに許可されていない方法でメモリ領域にアクセス
      • バッファのオーバーフロー
      • Null Pointerの不正利用
  • プロセススナップショット
    • プロセスのとある時点での全メモリ内容を取得

5章 Immunity Debugger

  • この章はImmunity Debuggerの利用方法について見ていく
  • Immunity DebuggerにはGUIがついている
  • Immunity Debuggerにはライブラリもついている
  • Immunity Debuggerのインストール(@Windows)
  • PyCommand
    • Immunity DebuggerでPythonを利用する場合は、この機能を利用する
  • PyHook
    • 各種イベントの検出時に実行される13種類のフックがある
  • 各種サンプル
    • 命令の検出(アセンブリコード(JMP ESP))
    • 不都合な文字の検出
    • DEP(Windows)の回避
      • DEP (Data Excution Prevention)
        • アプリやソフトウェアが実行不可能なメモリ領域からコード実行をする事を防止する
    • マルウェアのアンチデバッグルーチンを回避

6章 フック

  • (フック)http://ja.wikipedia.org/wiki/フック_(プログラミング)
    • プログラム中の特定の箇所に、利用者が独自の処理を追加できるようにする仕組み
    • ソフトフック
    • ハードフック
      • ターゲットのアセンブリコードにJump命令をハードコードする
      • 頻繁に呼ばれるルーチンで、(当該プロセスに対する)影響を最小限にしたい場合に有効
  • サンプル
    • ソフトフック
      • PyDbgで実装
    • ハードフック
      • Immunity Debuggerで実装

7章 DLLインジェクションとコードインジェクション

8章 ファジング

  • Fuzz
    • (例外が発生する様な)予測不可能なデータ
  • Fuzzing
    • Fuzzを(アプリケーションに)入力する事
    • Fuzzing Test
      • Fuzzデータを入力して脆弱性をチェックする
  • Fuzzer
    • Fuzz Tool / Fuzzer
      • Fuzzを与える為の自動化(半自動化)されたツール
    • 2種類のFuzzer
      • 生成ファザー
        • 新規にデータを生成
      • 変更ファザー
        • 既存のデータに変更を加える事でデータを生成
  • バグの原因となる現象
  • ファイルファザー

9章 Sulley

  • Sulley
    • PythonベースのFuzzing Framework
  • Install
  • プリミティブ
    • Sulleyの基本データ要素の事、下記の様な種類がある
      • 自動的にFuzzデータを生成してくれたり、生成するに当たっての細かい条件指定をする
    • 文字列
    • デリミタ
      • 文字列を細かく分割してFuzzを生成する
    • 静的データ
      • 変化させない部分
    • ランダムデータ
    • バイナリデータ
    • 数値
    • ブロック
    • グループ
  • SulleyでWarFTPDを破壊する

10章 Windowsドライバのファジング

  • ドライバとの通信
    • IOCTL(input/output control)を用いてドライバに情報を渡す
    • ドライバのハンドル取得
      • CreateFileW()
    • デバイス(ドライバ固有)にIOCTLを送る
      • DeviceIoControl()
  • ドライバファジング
    • ドライバに適用される前にDeviceIoControlの呼び出しを補足する
      • Immunity Debuggerのフック機能を用いる
  • ドライバ中の情報を取得する
    • driverlibライブラリ(@Immunity Debugger)を利用する(.py)
      • デバイス名を検出する
      • IOCTLディスパッチルーチンを見つける
        • 各種IOCTLを処理するルーチンの事
        • DriverEntryルーチン
          • ドライバのロード後、最初にロードされる
          • これよりIOCTLディスパッチルーチンの場所を取得
      • IOCTLコードを調べる
        • IOCTLディスパッチルーチン
          • IOCTLのコードに基づいてアクションが決定される
  • ドライバファザーの作成

11章 IDAPython

12章 PyEmu

所感

  • プログラムがWindows用であったため、ほとんど試せていない
  • Fuzzとか何かその辺の雰囲気が分かった気がする
  • レジスタとかそこら辺の復習が出来たのでよかったかな
  • この分野に関しては、今のところ、これ以上深く掘り下げるつもりはないので、十分には理解出来ていないがまぁいいか

履歴

Date History
2015/04/26 1章追加
2015/04/28 2章追加
2015/04/29 3,4章追加
2015/05/01 5章追加
2015/05/02 6,7章追加
2015/05/03 8,9,10,11,12章,所感追加