読者です 読者をやめる 読者になる 読者になる

kira924ageの雑記帳

日々の記録。

SECCON 2015 オンライン予選 write-up

CTF 辛い

はじめに

 SECCON 2015 オンライン予選にぼっちチームhoge444として出てた。

競技開催期間は2015年12月05日(土) 15:00:00(JST)から24時間。

実質2問しか解けなかった。

Title Genre Points
Start SECCON CTF Exercises 50
SECCON WARS 2015 Stegano 100
Connect the server Web/Network 100
Last Challenge (Thank you for playing) Exercises 50

Start SECCON CTF

問題文

ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}

quiz
Cipher:A}FFDNEVPFSGV}KZPN}GO
Plain: ?????????????????????

解法

置換表がex1で与えられているのでPythonのstring.maketransを使って変換テーブルを作る。

#!/usr/bin/env python2
# -*- conding: utf-8 -*-

import string

cihper = 'A}FFDNEVPFSGV}KZPN}GO'
table = string.maketrans('PXFR}QIVTMSZCNDKUWAGJB{LHYEO', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}')

print cihper.translate(table)

trコマンドでも解ける。

$ echo "A}FFDNEVPFSGV}KZPN}GO" | tr PXFR}QIVTMSZCNDKUWAGJB{LHYEO ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
SECCON{HACKTHEPLANET}

FLAG:

SECCON{HACKTHEPLANET}

Connect the server

問題文

login.pwn.seccon.jp:10000

解法

 まずncコマンドで接続を試みる。

f:id:kira000:20151206054213p:plain

WireSharkで通信を監視して適当にFollow TCP StreamするとFLAGっぽいものが見える。

f:id:kira000:20151206054234p:plain

FLAG:

SECCON{Sometimes_what_you_see_is_NOT_what_you_get}

SECCON WARS 2015

問題文

https://youtu.be/8SFsln4VyEk

解法

[追記]

 よくよく考えたらgifをそのままPythonで処理すればよかった。

  • Youtubeからmp4の動画をダウンロードしFree Video to GIF Converterで動画の00:25から01:05を切り取ってhoge.gifに変換(このときフレームレートは2 fpsで幅は600pxぐらいにするとよい)

あとは以下のようなスクリプトQRコードを作成すればいい。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from PIL import Image

gif = Image.open('hoge.gif')

width, height = gif.size
png = Image.new('RGB', gif.size, 'black')

while True:
    gif.load()
    for pos in ((x, y) for x in range(width) for y in range(height)):
        if gif.getpixel(pos) < 0x80:
            png.putpixel(pos, (0xff, 0xff, 0xff))

    try:
        gif.seek(gif.tell() + 1)
    except:
        break

png.save('flag.png', 'PNG')
  • gifのフレームレートを10 fpsにしたとき生成される画像

f:id:kira000:20151223012840p:plain

[ここまで追記]

 ひどい解き方をした。手順は次の通り。

  • youtubeから、問題の動画をダウンロード

  • Free Video to GIF Converterで動画の00:25から01:05を切り取ってhoge.gifに変換(フレームレートは1fpsにした)

  • convertコマンドで分離

$ convert +adjoin hoge.gif fuga.gif
  • Gimpで一枚一枚白黒の画像に加工(全部で42枚)。(画像>モード>グレースケールを選択し、色>しきい値からしきい値を127に設定)

f:id:kira000:20151206054353p:plain

(最初まっ黒な画像を作って読み込んだgifに白いところがあったら白を描画してる)

wars_solver.py · GitHub

※このコードは汚いだけでなくて実行時間もかなりかかるので色々とひどい。

f:id:kira000:20151206054433p:plain

  • 最後にQRコードを読み取るとFLAGが分かる。

FLAG:

SECCON{TH3F0RC3AVVAK3N53P7}

Last Challenge (Thank you for playing)

問題文

ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}

quiz
Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: ??????????????????????

解法

 最初の問題と同じ。

$ echo "A}FFDNEA}}HDJN}LGH}PWO" | tr PXFR}QIVTMSZCNDKUWAGJB{LHYEO ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
SECCON{SEEYOUNEXTYEAR}

FLAG:

SECCON{SEEYOUNEXTYEAR}

おわりに

 問題は全然解けなかったけど、時間はたくさん溶けた。とても辛かった。