setodaNote

忘れる用のメモ書き

Trend Micro CTF 2018 Quals Write-up

この週末に開催されていた Trend Micro CTF 2018 Quals にチームで参加していました。

ctftime.org

解いた問題について Write-up を記載します。

Reversing-Other 200

解き方

添付ファイルは Windows で実行可能な形式で UPX で圧縮されている様子。

( Hash )
MD5    : 8fe65336963d9d676deb0475cce3dc96
SHA1   : 96b4fb672fcaa0a69d3dcc77c7957b59a992f503
SHA256 : 7e321098688cdf8128639f1bcba836f589e19287dee190c9f62a74f94d79ef20
SSDEEP : 1536:1+BH9DUhnvgHxbgE7tdEMqeJ5H+/zfQWtxrAiAS4cfn0BvxhPCwLkxJIujCVCZ:1O26bg8XEMLe/Dp3rAiAwfn0Bvxh6wLG

( File command )
 PE32 executable (console) Intel 80386, for MS Windows, UPX compressed

( TrID )
 61.2% (.EXE) UPX compressed Win32 Executable (27066/9/6)
 14.8% (.DLL) Win32 Dynamic Link Library (generic) (6578/25/2)
 10.2% (.EXE) Win32 Executable (generic) (4508/7/1)
  4.5% (.EXE) OS/2 Executable (generic) (2029/13)
  4.5% (.EXE) Generic Win/DOS Executable (2002/3)
問題文に unpack Me とあるので試しに UPX にかけると unpack される。
これをそのまま実行するとフラグが得られなかったというメッセージとともに終了してしまう。

デバッガで処理を進めると怪しい文字列を見つける。
処理を進めると call 0x004062F0 の箇所で Y\\T= が UPX1 などに変換されることが分かる。
ということは他のものも変換すれば文字になりそう。

f:id:soji256:20180917143550p:plain
怪しい文字列

処理全体としては UPX0 や UPX1 の文字列と .data や .text を比較していき、
最終的に冒頭で見つけていた文字列 "J`mk,bcx,om|xy~ih,6$" が
フラグが得られなかったというメッセージに変換されていた。

バイナリエディタで問題ファイルの .text を UPX0 にしてみたがうまくいかない。
デバッガで処理を何度か進めるうちに 00405F40 で大きく分岐していることに気付く。
ZF を変更して処理の分岐を曲げると、フラグが得られた。

TMCTF{UPX0,UPX1} ★

(参考)ブレークポイントした箇所

  • 004058BA
  • 00405BE0
  • 00405E70
  • 00406028
  • 00407F48
  • 00405F40

フラグ

TMCTF{UPX0,UPX1}

f:id:soji256:20180917144227p:plain
フラグ

Reversing-Binary 300

解き方

添付ファイルは Windows で実行可能な形式の様子。

( Hash )
MD5    : 7c5c3bb4d931d280640a7977fba0bee7
SHA1   : 279967b5de4858d509b9764002015d7b63bc4f54
SHA256 : bdceea9ca0fc02cc48f2bfe20253a13dfaaee57b39d982c950ce60ec6907263d
SSDEEP : 96:XseFSomjUgLrHJWHpIeJtag128G2+1hDqBXi8Bdd/EjjTVc+E8wR3Y/VdU56D1fv:Xse9mjUgLrHIOe11onFKFUT6c8o/7lX

( File command )
 MS-DOS executable

( TrID )
 50.0% (.EXE) Generic Win/DOS Executable (2002/3)
 49.9% (.EXE) DOS Executable Generic (2000/1)

適当なコマンドライン引数を与えて、デバッガでこつこつ動かす。 KERNEL32.dll、msvcrt.dll、USER32.dll から関数名を次々拾い出している様子が確認できる。 とりあえず ret (0x004001FA) まで動かし、以降のチェックを適宜回避して進める。

 0x0040158A に IsDebuggerPresent があるのでチェック後の eax を 0 して終了を回避する。
 0x00401634 でも exit に分岐してしまうので ZF を 1 にするなりして回避する。
 0x004016A6 あたりに文字列長のチェックもあるのでこれも同様にして回避する。

その直後に単純な文字列比較をしている箇所があるので文字を拾ってみる。

 "5F 5F 5F 5F 31 47" → "____1G"

その後の分岐についても ZF を変更する要領で進めると、最終的に以下のような出力がされる。

 You Have Found The Key, please insert as TMCTF{F14g1s::ここに引数が入る}

"____1G" をコマンドライン引数にセットして、再度デバッガで動かすとフラグゲット。

 You Have Found The Key, please insert as TMCTF{F14g1s::____1G}

(参考)ブレークポイントした箇所

  • 004001D7
  • 004001DD
  • 004001E3
  • 004001F2
  • 004001F8
  • 004001FA

以下はデバッガ再実行時に無効になるので注意。

  • 0040158A
  • 00401634
  • 004016A6

フラグ

TMCTF{F14g1s::____1G}

f:id:soji256:20180917141824p:plain:w543
フラグ

更新

  • 2018/09/24 目次リンクが誤っていたので修正。