あけましておめでとうございます。今年もよろしくお願いします。
さて,私が所属するSPC同好会の部員(@akakou_py)がお年玉CTFを開催したので,せっかくなので取り組んでみたら,意外とあっさりできたので,Writeupを残しておきます。
問題
問題名は,Nabeatsuでした。あの3の倍数と3がつく数字の時にアホになる「世界のナベアツ」のことです。今は落語家をしているらしいですね。
問題はバイナリファイルが2つ,bokeとhutsuというファイル名でした。実際のファイルはSPCのslackの#randomから落とすか,直接akakouにもらってください。
解き方
まず,バイナリファイル2つを眺めました。バイナリファイルを眺める時のポイントは,最初の数バイトのマジックナンバーですね。
hutsuの先頭です。
16進数で,89 50 47 0D 1A 0A 00 00 48 52で始まってます。これに一番似たものが,PNGファイルのシグネチャとイメージヘッダの一部,89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52でした。赤文字にしたところが,hutsuファイルに欠けているところです。ここで,bokeファイルをみてみます。
先ほど赤文字で書いた 4E 0A 00 0D 49 44が含まれていることがわかります。ということは,この2つのファイルを合体させるとPNGイメージファイルが得られそうだとわかります。
ここで,法則性をみていきます。まあ,簡単です。問題名がNabeatsuであることからすぐわかります。3の倍数と(10進数で)3のつく数字のバイト数のときはbokeから,それ以外の時はhutsuから1バイトずつ持ってこればいいようです。
というわけで,Cで適当に合体させるためのプログラムを書きました。クッソ汚いですが…
プログラム
特に(10進数で)3のつく数字かどうか判定する文がひどいですね。クソ長いけどこう書いちゃうのが手っ取り早いと思ったので…
答え
年賀状の裏面のようなPNGイメージが得られました。
答えは,FLAG{H@PPY_NEW_YEAR_DA_WAN_!} でした。
感想
初CTFでしたが,意外とあっさりとできてしまいました。解答の送信は1:01で,問題のアップロードが0:10だったので,解答まで51分でした。一番早かったらしいです。
半分勘みたいなのが当たったのと,プログラムが一発で動いてくれたので,あまり悩まずにすみました。楽しいですよ,CTF。というわけで,お年玉はいただきました〜!!