マクニカさんから一般公開されたMNCTF2018のwrite-upです。

解くためにスクリプトが必要だったものに絞って思考の流れを残しました。

大量不正

100個のファイルの中から類似する物を見つけ出す必要がある。

いくつか中身を覗いてみたけど人間にとって意味のある内容では無さそう。

とりあえず先頭32バイトぐらいを比較する作戦でコードを書く。

あとは目grepしたら運よく全く同じ内容のファイルが見つかった。

ファイルが10,000個とかだったらもうちょっと考えないとダメだったかな。

files

穴埋防御

与えられた検体を眺めてみてもよくわからない。

ダメ元でcertutilでbase64デコードしたらpowershellスクリプトが出てきた。

certutil -f -decode Mutant.txt decode.ps1

文字列末尾に==があるとBase64であることが分かりやすいんですけどね。

スクリプトの中身は暗号化されたバイナリを

  1. Base64デコードして
  2. 0x17でXORして
  3. 実行する

という流れ。

実行する処理をコメントアウトしてファイルとして書き出すように変更した。

# ...省略
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の引数を確認して完了。

xor

盗難情報

rot13とbase64はpythonのcodecsで対応する。

xorの暗号鍵は1byteなので総当たりしてみたけど上手く識別できなかった。

この時点で一旦バイナリを眺めてみる。

xor

0x15が目に付いたので0x15で先頭4バイトをxorする。

\x89PNG

PNGのマジックナンバーが取れたので全体を0x15でxorしたら完了。

コードはこんな感じになった。