この大会は2017/2/4 20:30(JST)~2017/2/5 18:00(JST)に開催されました。
今回もチームで参戦。結果は570点で275チーム中8位でした。
自分で解けた問題をWriteupとして書いておきます。
BotBot (web 10)
http://botbot.bitsctf.bits-quark.org/robots.txtにアクセスしたら、次のような表示。
Useragent * Disallow: /fl4g
http://botbot.bitsctf.bits-quark.org/fl4g/にアクセスしたら、フラグが表示された。
BITCTF{take_a_look_at_googles_robots_txt}
Banana Princess (crypto 20)
添付のPDFはそのまま開けない。バイナリを確認すると、先頭が%CQSになっており、他のアルファベットもROT13になっている。変換して、PDFファイルを復号する。
with open('MinionQuest.pdf', 'rb') as f: data = f.read() output = '' for i in range(len(data)): code1 = ord(data[i]) if code1 >= 65 and code1 <= 90: code2 = code1 + 13 if code2 > 90: code2 = code2 - 26 elif code1 >= 97 and code1 <= 122: code2 = code1 + 13 if code2 > 122: code2 = code2 - 26 else: code2 = code1 output += chr(code2) with open('flag.pdf', 'wb') as f: f.write(output)
ファイルを開くと黒い塗りつぶし箇所がある。
画像コピーで切り出すと、フラグが見える。
BITSCTF{save_the_kid}
fanfie (crypto 20)
先頭がBITSCTF{に復号できると考え、そのBASE32コードを見てみる。
>>> import base64 >>> base64.b32encode('BITSCTF{') 'IJEVIU2DKRDHW==='
以下のように対応していそう。
M->I Z->J Y->E V->V I->U W->2 L->D G->K B->R 7->H C->W
5置きに一定のシフトをすると元のBASE32文字列になりそう。
import base64 b32_letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' enc = 'MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI' def b32_shift(c): index = b32_letters.index(c) index = (index * 5 - 20) % 32 return b32_letters[index] b32_enc = '' for i in range(len(enc)): b32_enc += b32_shift(enc[i]) b32_enc += '======' flag = base64.b32decode(b32_enc) print flag
BITSCTF{S2VyY2tob2Zm}
Enigma (crypto 30)
暗号文は"&"が間に入っているのが目立つ。"&"と" "(スペース)のASCIIコードのXORをXOR鍵として、全体にXORをかけてみる。
e = [ 'Dtorouenc&Vguugaoct+Mihpio&dcuenksr|r&dco&06&Atgb&Hitbch&shb&73&Atgb&Qcurch(&Hcnkch&Uoc&cu&ui`itr', '60<56*&Bgu&Qcrrct&our&ncsrc&mjgt(&Tcach&gk&Gdchb', 'Gbpghec&Ontc&Cohncor&7&Atgb&Hitbch&shb&4&Atgb&Iurch', 'Bct&Eibc&`?t&bch&Rga&our&DORER@}@iemc+Qsj`&@q&466{', 'Dctoenrc&bct&dtorouench&Kgtohc?dctqgensha&oh&Ontct&Tcaoih(&Acnch&Uoc&shbcteipct', 'Qot&pct`cnjch&Ritvcbiu(&Hst&4&?dtoa(&Uchbch&Uoc&boc&Joc`ctshach&ui`itr' ] key = ord('&') ^ ord(' ') for i in range(len(e)): d = '' for j in range(len(e[i])): d += chr(ord(e[i][j]) ^ key) print d
実行結果は以下の通りで、フラグが含まれている。
Britische Passagier-Konvoi beschmutzt bei 60 Grad Norden und 15 Grad Westen. Nehmen Sie es sofort 06:30, Das Wetter ist heute klar. Regen am Abend Advance Ihre Einheit 1 Grad Norden und 2 Grad Osten Der Code f9r den Tag ist BITCTF{Focke-Wulf Fw 200} Berichte der britischen Marine9berwachung in Ihrer Region. Gehen Sie undercover Wir verfehlen Torpedos. Nur 2 9brig. Senden Sie die Lieferungen sofort
BITCTF{Focke-Wulf Fw 200}
Beginner's luck (crypto 40)
24バイトずつXORで暗号化している。PNGヘッダから予想しても先頭16バイトのみ、あとは後ろ8バイトをファイル終端で確認し、鍵を求める。
with open('BITSCTFfullhd.png', 'rb') as f: data = f.read() PNG_HEAD = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52] PNG_END = [0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82] data_head = data[:16] data_end = data[-8:] key_head = '' for i in range(len(data_head)): key_head += chr(PNG_HEAD[i] ^ ord(data_head[i])) end_head = '' for i in range(len(data_head)): end_head += chr(ord(key_head[i]) ^ ord(data[-24+i])) #print end_head key_end = '' for i in range(24 - len(data_head)): key_end += chr(ord(end_head[-1]) ^ ord(data_end[i])) key = key_head + key_end flag = '' for i in range(len(data)): flag += chr(ord(data[i]) ^ ord(key[i%24])) with open('fullhd.png', 'wb') as f: f.write(flag)
復号すると画像ファイルにフラグが書かれている。
BITSCTF{p_en_gee}