はじめに
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読んでも楽しさが欠けるのでこれから数こなしていきたいです。
最後に。参加されたみなさん、お疲れ様でした。
運営の方、ありがとうございました。