さえぴ の めも

色んなアウトプットする。

ksnctf C92 #E1 「Mysterious Light」

お久しぶりです。
イギリスでインターンの機会をいただき、先日無事日本に帰って来ましたのでまた更新を再開しようと思います。

今回は2017年夏に開催されていた ksnctf C92 のwrite-upです。

全ての設問に対して表・裏が用意されており、表面を全答すると裏面が現れるという仕組みです。


問題【表】

f:id:saemero:20180131111653p:plain

QRコードに関する問題です。


解答までの道

向き読み取りの部分が煙で隠されています。
自分で補修してあげます。

⬇︎こんな感じ⬇︎
f:id:saemero:20180131113154p:plain

読み取ったらflagゲット。


問題【裏】

f:id:saemero:20180131113328p:plain


解答までの道

隠されている部分は誤り訂正レベルやマスクなどのQRコードのフォーマット情報が書かれている部分です。
QRの仕様についてはこちらが詳しく、参考にしました。

肉眼でも読める!QRコード入門 | quizknock

あとはQRを復号します。
QR decoder」とかでググるstrong-qr-decoder という超強力そうなデコーダーが出てくるのでそちらを使います。

strong-qr-decoderはQRコードを.txtデータで読み込むため、まずは問題のQRコードをテキスト化。

from PIL import Image

img = Image.open('flag2.png')

qr = ""

for y in range(177):
    for x in range(177):
        r,g,b = img.getpixel((x*8+36,y*8+36))
        if r < 255/2:
            qr += "#"
        else:
            qr += " "
        
    qr += "\n"

f = open('flag.txt', 'w')
f.write(qr)
f.close()

これで問題のQRコードをテキストファイルとして出力できます。

これをパラメータを変えながらstrong-qr-decoderに与えることで、flag(1237文字!)が出て来ます。
成功したのは誤り訂正レベル2、マスクパターン3の場合でした。