BITSCTF 2017 Writeup

この大会は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)

ファイルを開くと黒い塗りつぶし箇所がある。
f:id:satou-y:20170209203814p:plain
画像コピーで切り出すと、フラグが見える。
f:id:satou-y:20170209203847p:plain

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)

復号すると画像ファイルにフラグが書かれている。
f:id:satou-y:20170209204715p:plain

BITSCTF{p_en_gee}

Black Hole (for 10)

stringsコマンドで文字列を見てみると、Base64文字列らしきものがあった。それをデコードすると、フラグだった。

$ strings black_hole.jpg
          :
UQklUQ1RGe1M1IDAwMTQrODF9
     :
$ echo QklUQ1RGe1M1IDAwMTQrODF9 | base64 -d
BITCTF{S5 0014+81}
BITCTF{S5 0014+81}

Woodstock-1 (for 10)

TCP Streamで見ると、フラグが含まれていることがわかる。

BITSCTF{such_s3cure_much_w0w}