とある検体のOEP

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

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

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

## 検体

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

SHA-256
d09ac15f0d4fc36c4fe9dcc89e74248a51ddbd4f0822cc6562f813b81daba7cf

https://www.virustotal.com/gui/file/d09ac15f0d4fc36c4fe9dcc89e74248a51ddbd4f0822cc6562f813b81daba7cf/details

## 使用したデバッガ
32ビットのWindows7環境だったので OllyDbg を使用

## 解析失敗の条件
F8で走りすぎて最後まで行くと，779070B4 RETN で止まるので，再スタート

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

chrome.exeの中身に，ビットコインアドレス復号処理で使う
xor bl, 0ABh
や，クリップボードの中身の先頭が，数字の１かチェックしてる
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 

# 近道１～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を選定するべき。


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

目から鱗だ。。。