読者です 読者をやめる 読者になる 読者になる

Shi0shishi0

とても眠い。

SharifCTF 7 >>> Writeup

CTF セキュリティ

先週末行われていたSharifCTF 7 に参加しました。今回は1人での参加だったこともあり、Reversingを少しだけ。

Getit(Reverse50)

fileコマンドで見てみると、ELFファイル(64bit)とのこと。

getit: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=e389cd7a4b9272ba80f85d7eb604176f6106c61e, not stripped

アセンブリコードを見ていくと、このELFファイルは実行すると /tmp/flag.txt というファイルを生成しそうなのがわかる。ただ、最終的に生成したファイルを削除しそうなので、gdbで開いて適当なところで処理を止める。
そうすると、2個目のstrlen関数のところでFLAGが見える。

f:id:echoha610:20161223012832p:plain

SharifCTF{b70c59275fcfa8aebf2d5911223c6589}


RepairMe(Reverse100)

fileコマンドで見てみると、Windows(32bit)の実行形式ファイルとのこと。

repairme.exe: PE32 executable (console) Intel 80386, for MS Windows

とりあえず仮想環境で実行してみたら、いきなりクラッシュした。

デバッガでロードし、ステップ実行で見ていこうとしてもいきなりクラッシュした。
解析避けとかそういうものではなく、何かおかしな感じがするな~と思って色々見ていると、codeの権限が空になっていました。

f:id:echoha610:20161221232035p:plain

f:id:echoha610:20161221232111p:plain

権限をExecute/Readに変えてあげてもう一度実行するとFLAGが出た。

f:id:echoha610:20161221232117p:plain

Sharif{98ad7e41c78b7df41cb2ad0c17c61408}


SCrack(Reverse150)

fileコマンドで見てみると、ELFファイル(64bit)とのこと。

file SCrack 
SCrack: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=d011afc29443bbb3ea2c72ef5ac15f8dc278397a, not stripped
./SCrack
Enter the valid key!
AAAAAAAAAAAAAAAAAAAA
Invalid Key! :(

実行するとキーの入力を求められる。適当な値を入れてやると、「Invalid Key!」と返ってきます。これだけではよくわからないのでアセンブリのコードを見ていくことに。
64bitファイルはIDA Freeでは開けませんので、代わりにBinary Ninjaで見て行くことに。

すると、怪しい処理があったのでその周辺を確認していくと、FLAGの断片が1バイトずつハードコードされていました。

f:id:echoha610:20161222161605p:plain

SharifCTF{ed97d286f356dadb5cde0902006c7deb}


Unloadme(Reverse200)

未着手。だめです。(要復習)


Catch Me if You Can!(Reverse300)

未着手。だめです。(要復習)


Snake(Reverse400)

未着手。だめです。(要復習)


Nanomites(Reverse300)

マルウェア解析問っぽい感じだったので終わってから解きました。

問題文を見ると、C2サーバのIPアドレスとそこに対して送信しているデータの平文を見つけろ的なことが書かれています。問題文より、与えられているファイルはマルウェア(のようなもの)である可能性が高そうです。

fileコマンドで見てみると、Windows(32bit)の実行形式ファイルとのこと。

Nanomites.exe: PE32 executable (GUI) Intel 80386, for MS Windows

とりあえずCuckoo SandBoxに喰わせてみることにしました。
CTFの問題で与えられる、マルウェアっぽいWindows実行形式ファイルだと解析避けとかごちゃごちゃ搭載されているかなぁ、、、と思ったが普通に動きました。

C2サーバへの通信らしきものは、IPアドレス直接指定で発生していました。このIPアドレスをメモしておくことに。
このIPアドレスに対して、「Encrypted_Data:」 + 長さ0x18バイトのデータがサンドボックスからC2サーバに向けて送信されています。

f:id:echoha610:20161222153408p:plain

この送信されているデータの暗号化前のモノを手に入れたい。
普通にデバッガでデータを送信するあたりまで進めて、暗号化前のデータを確認しようかな~と思ったが、サンドボックスのログを見ているとデバッガは検知されそうな感じでした。

解析避けを躱しながら見ていくのは面倒臭いので、通信を行なっているあたりからIDAで見ることにしました。
サンドボックスのログでCALLされているAPIを確認すると、sendが使われているのが見えます。

f:id:echoha610:20161222153435p:plain

f:id:echoha610:20161222153437p:plain

IDAでsendがCALLされているあたりに飛び、それより少し上の処理を眺めてみると、「Encrypted_」という文字列がハードコートされている箇所が見えた。

f:id:echoha610:20161222153519p:plain

f:id:echoha610:20161222153522p:plain

この直前と直後には、sub_402C97がCALLされています。暗号化処理なら2回も「Encrypted_」の文字列を挟んで実行しない気もするな…と思ったので、その少し上の処理を見ていくことに。
sub_401260 という関数の中身を見てみると、怪しげなXOR処理×2個がありました。処理するデータのサイズをカウンタにしてループしているように見えます。そのサイズが0x18となっており、先程送信されていたデータのサイズと一致します。

f:id:echoha610:20161222153538p:plain

この中の処理をざっくり見ていくと、ECXレジスタの値をEDX + 0x02でXORしています。EDXには上の方にある、ハードコードされた0x44が入っています。
肝心の処理対象データは近くにあるかな~と探すと、関数の上の方で参照されていました。

f:id:echoha610:20161222153615p:plain

ここに入っているのが平文なのかと思ったら、送信されていたデータと同じ暗号文でした。どういうことだろうと関数の中をもう少し見てみると、右の処理で一度XORしたデータを同じキーで更にXORしているようでした。

f:id:echoha610:20161222153633p:plain

与えられたデータを0x46でXORしてみると、「This_Is_The_Secret_Data」という文字列が得られました。

f:id:echoha610:20161222153648p:plain

f:id:echoha610:20161222153651p:plain

問題文の指示通り、得られた2つの文字列を結合してMD5ハッシュ値を取って終わり。

>>> import hashlib
>>> hashlib.md5("155.64.16.51This_Is_The_Secret_Data").hexdigest()
'fb0e90f2ec7a701783e70e674fa94848'

SharifCTF{fb0e90f2ec7a701783e70e674fa94848}


300 Pointの割には簡単だったので、きちんと時間内にやれば良かったなとちょっと後悔しました。表層解析(動的解析)で得られた情報を元に見るべき場所を絞り、(デバッガで頭から見ていくのではなく)効率良く必要な場所を見て情報を得る、というマルウェア解析の流れを学べるような問題で良かったと思います。