この大会は2015/12/5 15:00(JST)~2015/12/6 15:00(JST)に開催されました。
今回はチームで参戦。結果は2300点で1251チーム中48位でした。
今回のチームではリバースエンジニアリングもできる人いるし、
分担してできるのも良かったですね。
今回も自分で解けた問題を中心にWriteupとして書いておきます。
Start SECCON CTF (Exercise 50)
この問題は単一換字暗号の問題で、こんな出題だった。
ex1 Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{} ex2 Cipher:EV}ZZD{DWZRA}FFDNFGQO Plain: {HELLOWORLDSECCONCTF} quiz Cipher:A}FFDNEVPFSGV}KZPN}GO Plain: ?????????????????????
SECCON{HACKTHEPLANET}
Unzip the file (Crypto 100)
暗号zipファイルが与えられている。
zipファイルには次のファイルが入っていることがわかる。
- backnumber08.txt
- backnumber09.txt
- flag
backnumber08.txtはSECCONのメルマガのものと推察して、
http://2014.seccon.jp/mailmagazine/backnumber08.txt
をダウンロードする。
ここからはzipファイルへの既知平文攻撃を行う。
$ zip backnumber08.zip backnumber08.txt $ ./pkcrack-1.2.2/src/pkcrack -C unzip.zip -c backnumber08.txt -p backnumber08.txt -P backnumber08.zip -d decrypted.zip $ unzip decrypted.zip Archive: decrypted.zip replace backnumber08.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A inflating: backnumber08.txt inflating: backnumber09.txt inflating: flag $ file flag flag: Microsoft Word 2007+
取り出したflagファイルをdocxの拡張子にし、
ファイルを開くと一見真っ白なページ。
ページ全体を黒字にすると、フラグが表示される。
SECCON{1s_th1s_passw0rd_ weak?}
Connect the server (Web/Network 100)
問題のURLにアクセスすると、ファイル「ダウンロード」がダウンロードされる。
バイナリエディタで見ると、フラグが隠れていた。
SECCON{Sometimes_what_you_see_is_NOT_what_you_get}
Decrypt it (Crypto 300)
次のような復号問題で、cryptoooモジュールは添付されている。
$ ./cryptooo SECCON{*************************} Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
どのような暗号化かいろいろ試す。
$ ./cryptooo abcd Encrypted(8): 8yTPUg== $ ./cryptooo abcdefgh Encrypted(12): 8yTPUiTwYG0= $ ./cryptooo abcdabcd Encrypted(12): 8yTPUiB/5Ts= $ ./cryptooo 1234abcd Encrypted(12): o9Z41ZbhLFA=
暗号文をBase64デコードしたものをバイナリで確認すると、
次のようなことがわかる。
- 暗号文をBase64デコードしたものは平文と同じ長さになっている。
- 異なる位置の同じ文字については、暗号文をBase64デコードしたものは異なるものになる。
- 平文の文字列の長さに関係なく、同じ位置の同じ文字について、暗号文をBase64デコードしたものは同じものになる。
そこでまず問題の暗号文をbase64デコードしたものをファイル保存する。
import base64 data = 'waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw='.decode('base64') f = open('encflag', 'wb') f.write(data) f.close()
そして総当たりで、暗号化してBASE64デコードしたものと
保存したファイルと比較するプログラムを実行し、フラグをゲットした。
import os import base64 list = ['0','1','2','3','4','5','6','7','8','9', \ 'a','b','c','d','e','f','g','h','i','j', \ 'k','l','m','n','o','p','q','r','s','t', \ 'u','v','w','x','y','z','A','B','C','D', \ 'E','F','G','H','I','J','K','L','M','N', \ 'O','P','Q','R','S','T','U','V','W','X', \ 'Y','Z','_','-','!','#','$','%','{','}'] flag = '' cmd = './cryptooo ' f1 = open('encflag', 'rb') data1 = f1.read() f1.close() for i in range(32): for j in list: flag_tmp = flag + j print flag_tmp os.system(cmd + flag_tmp + ' > flag.txt') f2 = open('flag.txt', 'rb') data = f2.read() f2.close() index = data.find(':') + 2 data2 = data[index:].decode('base64') if data1[i] == data2[i]: flag = flag_tmp break print flag
SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}
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}FFDNEA}}HDJN}LGH}PWO Plain: ??????????????????????
SECCON{SEEYOUNEXTYEAR}