SECCON 2015 Online CTF Writeup

この大会は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の拡張子にし、
ファイルを開くと一見真っ白なページ。
ページ全体を黒字にすると、フラグが表示される。

f:id:satou-y:20151206213133p:plain

SECCON{1s_th1s_passw0rd_ weak?}

Connect the server (Web/Network 100)

問題のURLにアクセスすると、ファイル「ダウンロード」がダウンロードされる。
バイナリエディタで見ると、フラグが隠れていた。

f:id:satou-y:20151206214339p:plain

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}