SECCON2017予選に参加した話

12月9日(土曜日)〜12月10日(日曜日)に行われたSECCON2017オンライン予選に参加したので結果と感想を書く
※フラグを取れた問題もあったのですが解法が綺麗ではないのでご容赦ください…

フラグが取れた問題

Vigenere3d(crypto:100)

問題はpythonで書かれた以下のプログラムからフラグ文字列(平文)と鍵を入力し示された暗号文と同じ出力結果を出す事だった

import sys
def _l(idx, s):
return s[idx:] + s[:idx]
def main(p, k1, k2):
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
i1 = 0
i2 = 0
c = ""
for a in p:
c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])]
i1 = (i1 + 1) % len(k1)
i2 = (i2 + 1) % len(k2)
return c
print main(sys.argv[1], sys.argv[2], sys.argv[2][::-1])
# $ python Vigenere3d.py SECCON{**************************} **************
# POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9


Vigenere(ヴィジュネル)暗号について
~wikipediaより~

普通のヴィジュネル暗号とは違い"3d"と付いていたので3次元なんだろうなと推測して問題に取り組んだ

鍵(プログラムの第2引数)の長さを調べると14文字だったことと平文から得られる情報"SECCON{"が7文字だったのでここから暗号化された文章を復号すればいけるかな、と考えた

試しに以下を入力して実行した

$ python Vigenere3d.py SECCON{AAAAAAAAAAAAAAAAAAAAAAAAAA} AAAAAAAAAAAAAA
SECCON{AAAAAAAAAAAAAAAAAAAAAAAAAA}

アスタリスク部分を"A"に置き換えて入力すると平文がそのまま出力された
次に第2引数の末尾の文字列をBに置き換えて実行した

$ python Vigenere3d.py SECCON{AAAAAAAAAAAAAAAAAAAAAAAAAA} AAAAAAAAAAAAAB
TECCON{AAAAAABBAAAAAAAAAAAABBAAAA}

出力結果を見ると一部の出力結果が異なっていることがわかる

また、これは第2引数の先頭文字のみを"B"に置き換えても同様の結果が出力されたので以下、地道にExcelをつかって対応関係を調べて変換していくと

SECCON{Welc0me_to_SECCON_CTF_2017}

がフラグとして導出できる

以下確認のため、平文と暗号文の対応関係を確認していくと※第2引数は次のようになった

AAAAAAA_aZ2PK_

※一例であり、他の文字列でも導出は可能

第2引数が決定したので先ほどのフラグ入力して確認を行うと

$ python Vigenere3d.py SECCON{Welc0me_to_SECCON_CTF_2017} AAAAAAA_aZ2PK_
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9

以下取り組んだ問題(解けなかった)

Ps and Qs(crypto:100)

zipファイルが与えられたので解答するとcipherと書かれたdataファイルが一つとpub1.pubファイルとpub2.pubファイルの3つのファイルが得られた
拡張子.pubについて検索すると公開鍵に関するファイルであることがわかったこととdataファイルの名前がcipherであったことから公開鍵暗号に関する問題であることが推測できた
タイトルの"Ps and Qs"について調べると2つの公開鍵を作成する際に鍵生成の際に共通の素数を使用されている場合、公開鍵から秘密鍵を生成できるものだった
公開鍵の多くが意図せず他のサイトと秘密鍵を共有している問題
ここまでわかっておきながらRSAの鍵の作成方法などがわからなかったので断念…

put_char music(programming:100)

linuxで動くc言語のプログラム…とのことらしいのでとりあえず.cファイルに直してみるかと書き直していたがいまいち出力がうまくいかなかった…

予選終了後、他の方のwriteupをみるとputchar_musicで検索すると.cファイルで音楽が鳴るらしく試しにやってみたらきれいにSTAR_WARSのテーマソングが出力されたので感動した(できることならコンテスト中に感動を味わいたかった…)
put_char musicで検索を怠ったのでもったいないミスをしてしまった…


まとめ

今回の予選では効率が悪いところが目立った。
唯一フラグが取れたVigenere3d問題も第2引数の入力を13文字であると誤認識してしまい、2時間近く悩んでしまったり、与えられたソースコードに対してプログラムを組んで自動化・効率化して回答できなかったりととにかく効率が悪かった…(ルービックキューブの画像処理とか…)
さらに致命的なのは基本的な知識不足と偏った得意分野でチームに貢献できなかったことが個人としての課題となった

チームとしてはThanksをあわせて4問400点という結果だったが、自分は全然貢献できなかったのが致命的だった…
特にチーム内でpwnやbinary問題に関しては(毎回どのCTFでも)誰も解けなかったので僕が強くなれば万事解決!と分かっていても全然挑戦していないので学ばねばならないことがたくさんあることが見えた予選だった。AVTokyoでpwnの入り口を教わったのに何も生かせていないとは…

来年はもっと上位をめざせるように積み重ねていきたい。