マクニカさんから一般公開されたMNCTF2018のwrite-upです。
解くためにスクリプトが必要だったものに絞って思考の流れを残しました。
大量不正
100個のファイルの中から類似する物を見つけ出す必要がある。
いくつか中身を覗いてみたけど人間にとって意味のある内容では無さそう。
とりあえず先頭32バイトぐらいを比較する作戦でコードを書く。
あとは目grepしたら運よく全く同じ内容のファイルが見つかった。
ファイルが10,000個とかだったらもうちょっと考えないとダメだったかな。
穴埋防御
与えられた検体を眺めてみてもよくわからない。
ダメ元でcertutilでbase64デコードしたらpowershellスクリプトが出てきた。
certutil -f -decode Mutant.txt decode.ps1
文字列末尾に==があるとBase64であることが分かりやすいんですけどね。
スクリプトの中身は暗号化されたバイナリを
- Base64デコードして
- 0x17でXORして
- 実行する
という流れ。
実行する処理をコメントアウトしてファイルとして書き出すように変更した。
# ...省略
if ($e_magic -ne 'MZ')
{
throw 'PE is not a valid PE file.'
}
# 以下の1行を追加
Set-Content -value $PEBytes -encoding byte "decode.bin"
# 以下の3行をコメントアウト
#$PEBytes[0] = 0
#$PEBytes[1] = 0
#Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes, $Func, $ProcId,$ForceASLR)
出力されたdecode.binをIDAに食べさせる。
yaraルールに追記するのはMutexなのでCreateMutexWの引数を確認して完了。
盗難情報
rot13とbase64はpythonのcodecsで対応する。
xorの暗号鍵は1byteなので総当たりしてみたけど上手く識別できなかった。
この時点で一旦バイナリを眺めてみる。
0x15が目に付いたので0x15で先頭4バイトをxorする。
\x89PNG
PNGのマジックナンバーが取れたので全体を0x15でxorしたら完了。
コードはこんな感じになった。