この週末に開催されていた Trend Micro CTF 2018 Quals にチームで参加していました。
解いた問題について 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 などに変換されることが分かる。 ということは他のものも変換すれば文字になりそう。
処理全体としては 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}
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}
更新
- 2018/09/24 目次リンクが誤っていたので修正。