SECCON 2014 #i18n Quals Writeup

TonkatsuNabe という考えるのに3秒かかってなさそうな名前のチームで参戦しました。

の4人での挑戦です。結果は2000点で、予選突破ラインには程遠い結果でしたが、初参加にしては上出来(自分はほとんど何もしていないが)で、その上4人で泊り込んで挑戦していたので楽しかったです。Welcome to SECCON (テスト問題) で First AC を取っていて驚いたりも。

まともに環境の準備をせずに突入したので、途中で Linuxインスコしたりするなど、どうでもいいところで時間がかかったのは反省点です。

以下自分が解いた問題をざっと。

QR 300 SECCON Wars: The Flag Awakens

SECCON WARS - YouTube

0:54- のあたりに SECCON の文字の裏でQRコードが流れているので ffmpeg でその辺のフレームをバラして Imagemagick で一番下の行を切り取り、また Imagemagick でそれぞれくっつける。その状態ではちょっと潰れてしまっているので Imagemagick で正方形っぽくする。Imagemagick 便利。

動画のほう、しばらく作業用BGMにしてました。

% ffmpeg -i qr.mp4 -f image2 %d.jpg
% for i in $(seq 823 903); do; convert -crop 320x1+0+239 ${i}.jpg qr-${i}.jpg; done
% montage -geometry 320x -tile 1x80 qr-*.jpg out.jpg
% convert -geometry 320x300! out-0.jpg out-good.jpg

f:id:tomo_ari:20141207212405j:plain

Web 200 REA-JUU WATCH

[http://reajuu.pwn.seccon.jp/]

最後の画面でスコアを JS で取りに行っていて、そいつの URL をちょっといじってやると rea-juu の ID とパスワードが出てくる。それでログインして適当に進めると選択肢にかかわらず 99999pt 得られてフラグも出てくる。

SECCON{REA_JUU_Ji8A_NYAN}

Programming 100 Choose the Number

require 'socket'

socket = TCPSocket.open('number.quals.seccon.jp', 31337)

loop do
  input = socket.gets
  puts input

  numbers = input.split(", ").map(&:to_i)
  p numbers
  question = socket.gets("? ")
  print question

  if question =~ /minimum/
    answer = numbers.min
  elsif question =~ /maximum/
    answer = numbers.max
  end

  socket.print("#{answer}\n")
  p answer
end

後から Socket#gets よりも Socket#recv, Socket#puts よりも Socket#write のほうが良いらしいという知見を伝授してもらった。

Web 300 Bleeding "Heartbleed" Test Web (挫折)

時間を大量に使って結局解けなかった。

HeartBleed が残っている OpenSSL 1.0.1e で通信するサーバーをさくらのクラウドに生やして、そこでパケットキャプチャして得た通信内容をコピペして、 https://github.com/emboss/heartbeat を適当に改造したスクリプトに貼っつけたりしていたが、結局脆弱っぽくないよとか言われてダメだった(適当)。

f:id:tomo_ari:20141207220101p:plain

本当に HeartBleed を抱えているサーバーを指定したらたまたま上のような画面が出てきて、SQLインジェクションすればなんとかなることは早い段階で分かっていただけに残念……。OpenSSL が HeartBleed の影響を受けるバージョンのままのサーバーはだいたいアダルトサイトだというどうでも良い知識も手に入った。