kimtetの日記

CTFのwriteupとか、勉強したこととか

SECCON 2014 横浜大会 CTF ネットワーク予選 write up 問1

さっそく問1の解説をするよ。 01フォルダの中にquestion.txtというのがあって、開くとこんな感じ。

問1

Find the Key!

0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 ........ ......E.
0010 00 34 f3 ed 00 00 40 01 88 d9 7f 00 00 01 7f 00 .4....@. ........
0020 00 01 08 00 bd c8 18 18 00 00 5a 6d 78 68 5a 33 ........ ..ZmxhZ3
0030 74 7a 5a 57 4e 6a 62 32 35 7a 5a 57 4e 6a 62 32 tzZWNjb2 5zZWNjb2
0040 35 39

問題の考え方

いきなり「キーを探せ!」とか言われて16進数の数字が並んだテキストファイル(上のやつ)がぺろりと渡される。 CTFの問題ってこういう説明不足気味なのがほとんどで、問題から「わかってるよな?」感と「わかってないやつはお断り」感がすさまじい勢いで出てる。

私も初心者なので一瞬面食らったけど、ネットワークの問題というくらいだからきっとネットワークパケットなんだろう。 このデータのどっかに「キー」があるらしいので、それっぽいものを探すことにする。

解法

テキストデータは一般的なバイナリエディタで開いた際の形式で並んでする。 それぞれの位置の数字に意味があるので、一応説明。

  • 一番左側の4けた数字
    「オフセット」と言って、その右に並んでるデータの位置(16進数で何個目か)を表してる。
  • 真ん中の16進数の羅列
    実際にやり取りされているデータ。コンピューターに必要なのはこれだけ。
  • 右側のドットとかアルファベット
    HEX ASCII dumpと言って、真ん中の16進数の羅列のデータを16進数ASCIIコードに割り当てて変換してみたもの。文字にならないところはドットになってる。
    機械的に変換しただけなので、文字になっててもそのまま文字の意味に使われているとは限らない点に注意。

んで、右側のASCII dumpを見てると、データの最後の方がまとまって文字になっていてあやしい。 ネットワークパケットのデータの最初のほうはネットワークの中を通り抜けるためのお決まりの情報(送信元とか送信先とかね)なので、データが入っているとしたら最後のほうになるっていうのもあってここに目をつける。

ZmxhZ3tzZWNjb25zZWNjb2

文字の並びがなんとなくbase64エンコードっぽいので、ダメもとでデコードしてみる。 こういった変換のためにコマンドラインツールnkfを入れていると便利。Windows用のもあるよ。

>echo ZmxhZ3tzZWNjb25zZWNjb2 |nkf -mB
flag{secconsecc

やった!なんか答えっぽい文字列が出た! でもなんか尻切れトンボ……。

そして問題文を見ると、最後の行の2文字分だけASCII dumpがないことに気づく(出題ミス?)。 しかたないので "35" と "39" を16進数ASCIIに変換して追加し、もう一度nkfにかける。

>echo ZmxhZ3tzZWNjb25zZWNjb259 |nkf -mB
flag{secconseccon}

正答は公開されていませんので断言できないけど、今度こそ正解だよね。以上!

参考情報

別解

実は超有名なネットワークパケットキャプチャソフトwiresharkに付いているコマンドラインツール text2pcap を使用すると、今回の問題のようなテキストデータのパケットをpcapファイルに変換してくれる。超便利!(SECCON挑戦時は知らなかった……くやしい)

変換したファイルをwiresharkで開くとICMPパケットだということがわかる。このICMPパケットのDataセクションに上で私があてずっぽうに求めた文字列が格納されているのがまるわかりなので、後は変換するだけ。