3DSCTFに参加した
CombKansaiを挟んでHarekazeから3DSCTFに参加しました。
ForensicとMiscを1問ずつ解きました。GIFと仲良くなった。
ページが凝っていたけど、点数配分が全部500(からのsolved数による減点)であんまり良くないと思った。
Microscope (Misc 487)
フレームを100000以上もつ単色のアニメーションGIFが渡される。微妙に色がことなる黄色と緑が交互に来ているようだ。
黄色や緑が連続する回数がモールス信号みたいになっているのかと思い、色が連続する回数を調べたがバラバラだった。
Microscope(顕微鏡)という名前なので、「ある画像を顕微鏡で見ていった部分部分をフレームにしているのでは?」と考えた。それなら1フレームずつ切り出して結合すればいいのだが、フレームを何枚横につなげるのかがわからない。横幅を1〜100000まで試すと時間がかかるので、黄色と緑を.
, X
に2値化して文字列にすることにした。こうすれば文字列を表示してエディタのウィンドウをリサイズすれば好きな位置で自動改行が試せる。実にアナログ。
GIFの仕様を見ながらこつこつ組んだ。
hex = File.binread('gif.gif').unpack("H*")[0] splitted = hex.split "21f904" # header for each frame header = splitted.shift # remove GIF Header ans = "" splitted.each do |fr| # for each frame lct = fr.index('32003200') if fr[lct+8] == '8' # using Local Color Table if fr[lct+10..lct+11].to_i(16) < 128 # Red value < 128 -> green ans += "." else ans += "X" # yellow end else # not using local color table -> yellow? ans += "X" end end puts ans
これで出力させて、端末のフォントサイズを小さくしいい感じにリサイズすると...?
読めなかったので、GIMPで修正。
これをスキャンするとFLAGが出てくる。
3DS{s0_y0u_kn0w_yur_g1fs}
What The Hex (Forensic 474)
よくわからないバイナリデータが渡される。バイナリエディタで見てみると、a98FIG
という文字列が。ここをGIF89a
に書き換えてみる。
こんな画像が見える。[]
でくくられていることから分かるとおり、これはFLAGではなかった。
他に何かあるかと思い、Global Color Tableの後のnullで埋まった部分を消してみたりした(画像では余計な部分まで選択してしまっているが)。
するとこうなる。でもFLAGじゃない。ファイルを壊しただけだった。
うーんと思ってじっくり読んでみるとIHDR
やGNP
という文字が。このファイルはJPEGとかPNGとかGIFをいっぱいくっつけてシグネチャの部分を書き換えたものだとわかる。また、テキストとして3DS[dddddd]
という文字列が多数入っているのでその中に混じってないか探してみる。
~/c/3/whatthehex $ strings binary.bin | grep '3DS{' 3DS{n0_t3ss3r4ct_7h15_71m3}
FLAGが出た。
せっかくなのでsed
の練習も兼ねてa98FIG
となったりGNP
みたいにひっくり返っているシグネチャをもとにもどしてforemost
に切り出させてみる(手抜き)。
$ sed -e 's/\(..\)/\1\ /g' -e 's/61\ 39\ 38\ 46\ 49\ 47\ /47\ 49\ 46\ 38\ 39\ 61\ /g' -e 's/47\ 4e\ 50\ /50\ 4e\ 47\ /g' -e 's/\ //g' binhex.txt > changed-signature.txt $ cat changed-signature.txt | tr -d '\n' | xxd -r -p > changed-signature.bin $ foremost changed-signature.bin
こんな画像が大量に入ってた。
https://gyazo.com/b73cc54f8d9439605ed57a7ab94a3eac