アンチアンチデバッギング #lt駆動

66
アンチアンチデバッギンギング LT 駆動開発 #10 @mrtc0

Upload: mrtc0

Post on 20-Jul-2015

656 views

Category:

Technology


0 download

TRANSCRIPT

アンチアンチデバッギンギング

LT 駆動開発 #10@mrtc0

あけましておめでとうございます今年もよろしくお願いします

自己紹介

● Twitter : もりたこ (@mrtc0)● Blog : mrt-k.github.io

● ハニーポット観察

マルウェアの動的解析

動的解析

● マルウェアを実際に動かして解析– レジストリアクセスやパケットの記録– 挙動を把握しやすい– 短時間– もちろん感染する

● VM起動 ~解析 /レポート生成までを自動でしてくれるツールもある– Cuckoo, Zero Wine Tryouts

マルウェア側の抵抗● 動的解析の妨害 (アンチデバッグ )

– 解析ツール (デバッガなど )の検出– 実行時間の計測

● VM環境の検知– Vmware Toolsなどのバックドア I/Oポート– 起動時間– リアルとサンドボックスの違い

http://www.atmarkit.co.jp/ait/articles/1404/18/news004.html

マルウェア側の抵抗● 動的解析の妨害 (アンチデバッグ )

– 解析ツール (デバッガなど )の検出– 実行時間の計測

● VM環境の検知– Vmware Toolsなどのバックドア I/Oポート– 起動時間– リアルとサンドボックスの違い

http://www.atmarkit.co.jp/ait/articles/1404/18/news004.html

アンチデバッグ手法

● 解析ツールの検出– リソースアクセスやパケットの監視

● Process Monitor, Process Explorer,WireShark

– デバッガ● Immunity Debugger, OllyDbg

● これらのツールやプロセスを検出され ,

自身の動作を変更 ,停止するマルウェア

アンチデバッグに対抗するアンチアンチデバッギング!

Case 1: プロセスを取得するマルウェア

デバッガなし

デバッガあり

マルウェアの概要

● CreateToolhelp32Snapshotでプロセス一覧のスナップショットを作成

● Process32First(Next)でプロセスの情報を取得● 実行ファイル名に “ ImmunityDebugger.exe” が

あれば Detected. と表示される

回避法

回避法 1. ファイル名の変更

ファイル名の変更

● ファイル名だけチェックしているなら変更すればいい

回避法 2. Process32Firstで 0を返す(プロセス名の列挙を止める )

Case2 : ウィンドウの検出

Process Monitorなし

Process Monitorあり

マルウェアの概要

● EnumWindowsでウィンドウを列挙– Process Monitorは PROMON_WINDOW_CLASS

● GetWindowTextでタイトルバーの文字列を取得するものも

回避法

回避法

● EnumWindowsなどの戻り値を変える

● いちいち戻り値を変更するのが面倒なので、常に 0を返すように命令を書き換える– Immunity Debugger付属のアンチデバッグ回避用スクリプトを使うと楽

hidedebug.py

EnumWindowsのエントリポイント

書き換える

XORで EAXを 0に

呼び出し元に戻り ,0x0C(引数のサイズ )分戻る

Case 3 : デバイスファイルの検知

マルウェアの概要

● カーネルモードで動作するツールは ,固有のデバイスファイルを作成するものがある .– ProcessMonitorは \\ .\Global\ProcmonDebugLogger

● CreateFileで検出している● しかし ,CreateFileは使用頻度が高いため ,

マルウェアが正しく動いてくれなくなる

回避法

検出しているデバイスファイルを確認

CreateFileAの第 1 引数が “ \\. \Global\ProcmonDebugLogger” だった場合に戻り値を書き換えれば良い

条件式の設定

戻り値を

0xFFFFFFFF(-1)にする

回避!

Case 4 : 時間計測するマルウェア

マルウェアの概要

● デバイスファイルの検出を行っている● CreateFileの処理が一定秒内に完了しなければデバッグされていると判断している .

→これまでのように手動でレジスタの値を書き換えるのは無理

回避法

ブレークポイントでの任意の操作を自動化

ESP+4 (第1引数 )の取得

Process MonitorであればEAXを 0xFFFFFFFFに書き換える

EIPにリターンアドレス ,ESPに巻き戻した値を書き込む

Case 5 : IsDebuggerPresent()

マルウェアの概要

● IsDebuggerPresent()で自身がデバッグされているか判断

● これも戻り値を書き換えればいい

● ただ ,IsDebuggerPresent()を使用せずに検知しているものもある

IsDebuggerPresentの実装

IsDebuggerPresentの実装

FSレジスタ内の TEB(Thread Environment Block)構造体のオフセット 0x30にある ,PEB(Process Environment Block)構造体のオフセット 0x02にある ,BeingDebugged byte-flagを読んでいるだけ

BeingDebuggedにデバッグされているかのフラグを書き換えるだけ!

BeingDebuggedの値を

0にして

回避!

まとめ

● マルウェアだけでなく ,ゲームのチート対策にも使われてたりするらしい

● VM検知についても勉強したい● アンチアンチアンチデバッギングについても考えたい

● #malwaremustdie!

ご清聴ありがとうございました!

参考 アナライジングマルウェア (O'REILLY)

AntiCracking – IsDebuggerPresenthttp://www.michael-puff.de/Programmierung/Artikel/AntiCracking_1.shtml