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

SECCON 2016 WriteUp

はじめに

SECCON2016に参加しました。

初CTFです。

開催されていることに当日気がついた程度の情弱ですが、 とりあえず手を動かしてみたかったのでチャレンジしてみました。

結果1問解答でした。せっかくなのでwriteup残します。

Vigenère

問題

k: ????????????

p: SECCON{???????????????????????????????????}

c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe

解答

Vigenère暗号です。

問題文にもWikipediaのリンク付きです。

ただオリジナルがアルファベット26文字に対して{,}の2文字が追加の28文字版です。

ASCIIコード見ながらAが0になるように65文字シフトさせます。

ただし、{}はASCIIコードの123と125でZの次じゃないので、それぞれ[\に置換して順番を揃えます。

pのSECCON{を対応表からkがk: VIGENE??????だとわかります。 それならあと2文字も暗号名から推測してk: VIGENERE????でしょうか。 この時点でとりあえず復号してみます。

c = 'LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ'
c = c.replace('{', '[')
c = c.replace('}', '\\')

p = len(c)*[0]

k = 'VIGENERE'
shift = 0 # len(k)ずつずらす

for i in range(len(k)):
    p[i] = (ord(c[i + shift]) - ord(k[i])) % 28
    p[i] = chr(p[i] + 65)

print p

ここまでで p: SECCON{A????BCDEDEFG????KLMNOPQR????VWXYYZ} とわかります。

いい感じにアルファベット順ですね。

残り4文字はcipherとかcryptとかかなぁと思ったものの文字数が合わないものの最初はCでいってみるかと思いやってみると p: SECCON{AB???BCDEDEFGH???KLMNOPQRS???VWXYYZ} となりました。

最初の???をBABとなれば綺麗かなぁと思って暗号文cを見ながら対応表を見て、k = 'VIGENERECODE'となったので良さそうです。 あとは上記のコードそのままkだけ変えて終わりです。

p: SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}

感想

Vigenèreはわりとすぐにできたのでもう1問!!と思ってVoIPやってみたのですが、何をしていいやらとなったので他の方のwriteup見て研鑽が必要です。

でもいろいろ記事ばっかり読んでいて自分で手を動かさないとwriteup読んでも楽しさが欠けるのでこれから数こなしていきたいです。

最後に。参加されたみなさん、お疲れ様でした。

運営の方、ありがとうございました。