LoginSignup
0
0

とある検体のOEP

Last updated at Posted at 2022-10-25

一番下に「近道」を追記しました。

地道な道

後進のために 検体 と OEP (Original Entry Point) へ確実にたどり着くことが出来るロードマップを公開します。
このような記事は世にあまりなく画期的ではと自画自賛です。
マルウェア解析訓練において試行錯誤の手助けになればと思っております。

OEPを発見するコツ
・基本は F8 でこつこつ進む。
・ループに入ったら出口にブレークポイント(以下BP)を仕掛けてF9
・F8で走りすぎたら,その場所にBPをしかけて次からはF7
・長距離ジャンプ や CALL レジスタ は,あやしい。
・ESP(エスパー)も大事
たとえば,02019F20 CreateDialigIndirectParamW で困ってるとき
02002134 CALL EDX にブレークポイントをしかけてピンチを脱するなど

検体

Andromeda bot (アンドロメダボット)の亜種として検知されているようですが,クリップボードに保存されたビットコインアドレスを攻撃者のものにすり替える機能を有しています。
メモ帳に保存していた自分のビットコインアドレスを入金先として他人に教えようとメール本文にコピペしたら,中身がすり替わってるってヤツです。

SHA-256
d09ac15f0d4fc36c4fe9dcc89e74248a51ddbd4f0822cc6562f813b81daba7cf

使用したデバッガ

32ビットのWindows7環境だったので OllyDbg を使用

解析失敗の条件

F8で走りすぎて最後まで行くと,779070B4 RETN で止まるので,再スタート

解析成功の条件

Process Hollowing で使う SetThreadContext, ResumeThread などのAPIのIATが再構築され,CreateProcessW のCALLでは,引数に PUSH 4 ( CREATE_SUSPENDED ) がある。

chrome.exeの中身に,ビットコインアドレス復号処理で使う
xor bl, 0ABh
や,クリップボードの中身の先頭が,数字の1かチェックしてる
cmp byte ptr [ebp+0], 31h
が存在する。

解析開始

再スタート

02043C90 で止まってる

F8 で進める
ループしはじめるので先にBPをしかけてF9で進めていく

02043E1C でF8すると最後まで走るので,再スタート

ちなみに,SANS FOR610で得た知見,「UPXの場合,0x00の塊の直前の jmp 命令の飛び先が OEP」でやると下の0200B2ADが OEP ってことになるけど,この検体は何重かpackされているようです。

02043E1C にBP 止まったら F7

0200B2AD に入ってくる
F8 で進める
0200B387 でF8すると最後まで走るので,再スタート

0200B387 にBP 止まったら F7

02018327に入ってくる
F8 で進める
02018337 でF8すると最後まで走るので,再スタート

02018337 にBP 止まったら F7

0201EEAB に入ってくる
F8 で進める
0201EEEF でF8すると最後まで走るので,再スタート

0201EEEF にBP 止まったら F7

02001070 に入ってくる
F8 で進める
020010D2 でF8すると最後まで走るので,再スタート

020010D2 にBP 止まったら F7

0201A092 に入ってくる
F8 で進める
0201A14A でF8すると最後まで走るので,再スタート

0201A14A にBP 止まったら F7

02019DAE に入ってくる

この先の 02019F20 CreateDialigIndirectParamW でF8を押すと走りすぎるが,F7を押すと772CEA10に入り,非常にややこしくなる。ここを切り抜ける解説は省略する。

ctrl + G で 02002134 CALL EDX へ

02002134 にBP 止まったら F7

xxxx0028 に入ってくる ※xxxxは動かす度に変わるアドレス

xxxx0592 のあたりから,
LoadLibraryA
GetProcAddress
が繰り返される。
IATの再構築をやっている。たぶん。

F8 で進める
xxxx09D3 でF8すると最後まで走るので,再スタート

xxxx09D3 CALL EDI にBP

止まったら F7 でステップイン
yyyy0000 に入ってくる ※yyyyは動かす度に変わるアドレス

ここがたぶん OEP

OEPに到達すると Process Hollowing を見ることができます。

Process Hollowing

yyyy277B にBPを設定し,F9でジャンプ

Process Hollowingの様子がよくわかる
chrome.exe(IEの場合もある) のフルパスが EAXに
yyyy2774 PUSH 4 は, CREATE_SUSPENDED
yyyy278B CreateProcessW
yyyy27AD GetThreadContext
yyyy2873 VirtualAllocEx
yyyy28B4 WriteProcessMemory
yyyy29B1 SetThreadContext
yyyy2E7E ResumeThread

近道1~APIに着目せよ!~(追記 2023/06/21)

動的解析すると、chrome.exe(chromeなければIE)を実行して自分は終了するので、Process Hollowingしていることがわかる。
OEP付近に飛ぶには、x32dbg(ollyで出来るかは未確認)で
bp GetThreadContext ※1 を設定しておき、
F9
止まったら
Execute till return(Ctrl+F9)※ここで Run to user code をすると制御が戻ってこない!
ret 8まで進むので
F8
をすれば、ユーザーコードに戻り、上に隠れた部分をスクロールで戻せば
PUSH 4 (CREATE_SUSPENDED)
とかが見える。

目から鱗だ。。。

※1 最初はCreateProcessAとCreateProcessWの両方を設定したが、違うところで何回も止まる。
OEP以降でしか使わないAPIを選定するべき。

近道2~pushadがあったら試しとけ!~(追記 2023/06/21)

Entrypoint付近のpushadに着目
pushadはEAX~EDIまで8個のレジスタの値を全てスタックに待避させる
これを取り出すpopadの近所がOEP
では、
pushadをF8で進める
スタックの先頭(EDIが入っている場所)で右クリック
ハードウェアブレークポイントを設定する
Hardware Access Dword
F9
止まったら上にスクロールさせると
popadが見える
少し下に 大ジャンプがあるので、そのジャンプ先がOEP

目から鱗だ。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0