setodaNote

忘れる用のメモ書き

CTFZone 2018 Quals Write-up

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

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

Validator3000

解き方

添付ファイルの中身は実行形式。
TrIDによると 64bit の Windows で動く様子。

 TrID: 
  72.3% (.EXE) Win64 Executable (generic) (27625/18/4)
  11.8% (.EXE) Win32 Executable (generic) (4508/7/1)
   5.3% (.EXE) OS/2 Executable (generic) (2029/13)
   5.2% (.EXE) Generic Win/DOS Executable (2002/3)
   5.2% (.EXE) DOS Executable Generic (2000/1)

バイナリエディタで眺めたり、Strings をかけたりしたが特にフラグにつながるものはなさそう。
IDA Pro で処理を確認すると「Congratulations, you won!」の文字が見つかる。
この部分まで処理を進められればフラグが得られそう。

f:id:soji256:20180723220908p:plain
IDA Pro で見たところ

デバッガで動かしてみるが、入力処理が思ったよりうまく動かせず。
途中、 Process Hacker でメモリ中にフラグが出ていないか確認したが見つからず。
しばらく色々と試すが、筋が悪そうだったので他の方法を検討することにした。

バイナリエディタで眺めたときに、ビットマップイメージの模様から
いろんなファイルが含まれていそうだったので、7-zipで展開してみる。
テキストやPNG画像が見つかるが、ここでもフラグは見つけられなかった。

とりあえず普通に実行してみることにした。
起動すると入力ボックスが表示される。

f:id:soji256:20180723215407p:plain:w369
入力ボックス

適当な文字を入力すると「Bad flag」と表示された。

f:id:soji256:20180723215358p:plain:w366
適当な入力をしてみたところ

ここで「これってメモリに比較対象の文字列残っているのでは」と気付く。

Process Hacker でメモリに ctfzone の文字列がないか探したところ
見事にフラグが残っていた。

フラグ:

ctfzone{R3Flec7i0n}

f:id:soji256:20180723215348p:plain
メモリ上にあるフラグが確認できる

EZPZ CRKMEE.

解き方

添付ファイルの中身に Strings をかけると以下の文字列が見つかる。
  q1   zsaw2  cxde43   vftr5  nbhgy6   mju78  ,kio09
これを検索することで、これがAVRマイコンに関係したファイルであると分かる。

何かしらのエミュレーターを探して動かすことにした。
検索すると「AVR Simulator IDE」というのが見つかったが、
これで動かすためにはテキスト形式のファイルに変換する必要がありそうと分かる。

探すと以下のツールでテキストに変換できそう。

 HexConv:Hexファイルフォーマット変換ツール
 http://www1.bbiq.jp/tatsun/hexconv.html

変換後のファイルを先程のエミュレーターに読み込ませる。
 
 AVR Simulator IDE with AVR Basic Compiler, Assembler, Disassembler and Debugger
 http://www.oshonsoft.com/avr.html

[Tool]->[Breakpoints Manager] を開いてからスタートする。

動かせ続けると、あるところでループに入る。
どうやら無限ループの様子。

Breakpoints Manager でコードの先の方を見ると
ASCII文字列とメモリ上の値を比較している箇所があると気付く。

f:id:soji256:20180723213109p:plain:w488
ASCII文字列とメモリ上の値を比較している

これを動かしたときの動作が気になる。

そこで、無限ループに入ったところで PC Register の値を直接書き換えて、
先程の比較処理(アドレス「0x000360」)のところに処理を移す。

なお、すべての分岐をスルーするように、メモリの値を予め書き換えておく。

f:id:soji256:20180723211449p:plain
メモリの値を予め書き換え

この状態で [F2] を押下でステップ実行していくと、
先述の比較処理の後でメモリになにかASCII文字を出力しているような処理に移るのが分かる。
具体的には R24 あたりにそれっぽい値を出力し始める。

ただ、その文字列は記号を多く含むもので、
フラグとして違和感のあるものだったので、
どうやらフラグではなさそうだと判断。
  
さらに処理を進めていく。

すると再びループ処理に入ったようだったので
メモリ上になにか出力されていないか確認したところ、
ASCII範囲の値を発見、これがフラグだった。

フラグ:

ctfzone{3ebce55ece229481ee618e}

f:id:soji256:20180723211507p:plain
メモリ上にあるフラグが確認できる

なおこのときのループ処理は無限ではなかった。
処理を進めていくと先程入力した値やフラグをすべて消去する処理が走るので、
本当に偶然よいタイミングで止めて気づいた。。。

更新履歴

  • 2018-09-17 解き方のみ記載する形に修正。