狠狠撸

狠狠撸Share a Scribd company logo
アンパック手法
~HamaCTF 2019 Write Up編~
@Sh1n0g1
HamaSec 201904
アンパック処理はx64dbgをメインで利用
? メモリブレークポイントの利用など
? ハードウェアブレークポイントを利用するため
HamaSec 201904
パッカーの話の前に元の検体を調査
HamaSec 201904
パックされていない検体の調査
? フラグを表示する分岐
HamaSec 201904
分岐の前ではGetUserNameA関数が実行さ
れている
https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getusernamea
HamaSec 201904
文字列を比較している
arg_0
arg_4
u n p 4 c k e d 0
u s e r n a m e 0
esiedi
HamaSec 201904
フラグ生成
? Sub_401039は文字列の結
合をしており、
「402050」にメッセージ
の文字列を構築している
HamaSec 201904
アプローチ
? デバッガー上でユーザ名を取得した直後に処理を止める(ブ
レークポイント)
? メモリ上のユーザ名を「unp4cked」に書き換える
? 処理を再開させる
HamaSec 201904
Breakpoint
HamaSec 201904
メモリの書き換え
? 左下のMemory Dump欄上で[Ctrl + G]で書き換えた衣装の402004
番地に飛ぶ
? 書き換え対象のバイトを複数選択する(最低9バイト)
? 選択した箇所を右クリックし、[Binary]の[Edit]を選択する
? 「unp4cked」に書き換えて、OKボタンを押す
書き換え後
HamaSec 201904
実行する
HamaSec 201904
アンパックのメリット
? IoC(通信先、レジストリ名、ファイル名など)がstrings抽出で
きるようになる
? Anti-Sandbox、Anti-XXが特的できる
? そもそもパックされているマルウェアって多いの?
? 著名なパッカーによってパックされているマルウェアは少ない
が、実行されるコードが暗号化されていて、復号されながら実
行されることはざらにある
HamaSec 201904
パッカーの特徴
? 書き込み権限および実行権限のあるメモリセクションを利用す
る
? アンパックでオリジナルコードを復号?解凍した後にそのまま実行す
るため。
? パックされていない実行ファイルでは稀。
? そのようなメモリセクションはPEヘッダーで定義されているか、
後から動的に割り当てられる( VirtualAlloc、VirtualProtection)
? アンパック処理が終わるとオリジナルの実行コードが始まる
(=Original Entry Point: OEP)
HamaSec 201904
UNPACK01を解いてみる
HamaSec 201904
Memory Mapを参照する
実行権限「E」
および書き込み
権限「W」を
持っている
HamaSec 201904
実行前は空っぽ
? ….ということは間違いなく後で何かが書きこまれる
HamaSec 201904
Memory Breakpointをしかける
HamaSec 201904
BreakPointに引っかかるまで待つ
? ヒットすると平文の内容が見えて、フラグの文字列がわかる
HamaSec 201904
UNPACK02を解いてみる
HamaSec 201904
Memory Mapを確認
? セクションはひとつしかなく、エントリーポイントになってい
るため、ブレークポイントを置いてもすぐに発動してしまう
HamaSec 201904
利用されるAPIでブレークポイントを置く
? 前提条件として、アンパックされたマルウェア自体が利用する
APIを知っていること
? これはサンドボックスやAPI Monitor を利用すると調査可能。こ
こでは割愛
? GetProcAddressを利用することがわかっているため、ここにブ
レークポイントを置くことにする
http://www.rohitab.com/apimonitor
HamaSec 201904
GetProcAddressの番地を調べる
? [Symbol]タブをクリックし、[kerner32.dll]をクリックし、右側の
ペインから「GetProcAddress」を探す
? ダブルクリックをする
HamaSec 201904
Retにブレークポイントを置く
HamaSec 201904
GetUserNameAが出てくるまで実行する
? 実行すると画面右側の中央にスタックの上部(つまり、
GetUserNameA)のパラメータが表示される
? “GetUserNameA”が出てくるまで実行する
? パッカー自体がGetProcAddressを利用するため
HamaSec 201904
フラグが見える
? GetProcAddress関数のRETを実行し、ライブラリから抜けると…
HamaSec 201904
kkrunchyならではの別解
? x64dbgにはScript機能があり、kkrunchyを解析するためのスクリ
プトが提供されている
https://github.com/x64dbg/Scripts/ HamaSec 201904
Scriptタブでスクリプト実行
? Scriptタブでスクリプトを[Load]する
? スペースバーでスクリプトが実行できる
? kkruncy解析スクリプトは、EntryPointで停止していることが前提
HamaSec 201904
実行すると
HamaSec 201904
CPUタブに行くと
? マルウェアのオリジナルの処理の手前で止まっている
HamaSec 201904
UNPACK03はUNPACK01と同じ手法で解ける
HamaSec 201904
UNPACK04はUNPACK02と同じ手法で解ける
HamaSec 201904
全問共通の手っ取り場合解き方
? MessageBoxはスレッドが処理待ちになり、処理は停止する(ブ
レークポイントとほぼ同じ)
? MessageBoxが表示されたら、実行を停止する
? [Ctrl + F9]を実行するとRetまで実行することができる
? ステップ実行して、一個上の関数に戻る
? ライブラリから戻ったところがアンパックされたマルウェアの
関数
HamaSec 201904

More Related Content

HamaCTF WriteUp (Unpack category)

Editor's Notes

  • #5: フラグを表示するか、エラーメッセージを表示するか分岐しており、直前にcallされている関数の結果(eax)が条件となっている 左側に分岐するためにはeax=00で抜けてこなければならない 直前の関数は402004に格納されている値と、文字列”unp4cked”がパラメータとして渡されている まずは402004に何が入るか見てみる
  • #6: 402004はcall eaxの直前でプッシュされている。 call eaxのeaxは直前のGetProcAddress関数の戻り値である。 GetProcAddressは「GetUserNameA」というWinAPIの番地を調べる関数であるため、 call eaxはGetUserNameAを呼び出しているということがわかり、402004には現在ログインしているユーザ名が入ることがわかる sub_401017では何をしているかを見てみる
  • #7: 受け取ったパラメータ(arg_0、arg_4)をesi、ediに格納し、mov dl,[edi]で1バイトを取得し、esiの1バイトと比較している 同じでない場合は、ecxをひっくり返す(→0xffffffffにある) 終了時にeaxにecxの値を代入している つまり、文字列が同じであれば、eaxは0、異なれば、0xffffffffで関数から抜ける