SECCON CTF 2014 online 参加しました
初ブログです。
記念すべき第1回目は先日(12/06~07)行われた
SECCON CTF 2014 online の Writeup です(といっても全て100点問題ですが)。
こちらも初参加ということで解けた問題は
Start 100(Welcome to SECCON), Crypt 100(Easy Cipher),
Forensics 100(Get the key.txt), Programming 100(Choose the number),
Network 100(Get the key)です。
Start 100
フラグはこんな感じですよということで問題文に書いてありました。
SECCON{20141206}
Crypto 100
問題文がいろんな基数で書いてありそうなので、
まず特徴を見ながら以下の要領でそれぞれを10進数表示にします。
#!/usr/bin/env python # -*- coding: utf-8 -*- #crypto100.py def change_dec(num): if cnt[0] == '0': return int(cnt, 8) else: if len(num) >= 4: return int(cnt, 2) elif str.isdigit(cnt): return int(cnt, 10) else: return int(cnt, 16)
それを文字コードとして表示してあげると文章の最後にフラグがありました。
SECCON{W31C0M 70 7H3 53CC0N ZOIA}
(Welcom to the SECCON 2014ですかね。)
Forensics 100
zipファイルが与えられていたのでとりあえず解凍して、
解凍後のファイル形式を調べます。
$ unzip forensic100.zip $ file forensic100
この時点で ext2 形式のファイルであることが分かります。
ちなみに、中身を確認すると大量のフラグのようなものを確認できました。
$ strings forensic100 | less
当たりを付けれなかったので適当なところにマウントします。
# mount -t ext2 forensic100 /path/to/mountpoint
で、でてくるファイルはgzip形式なので解凍。
# rename 's/$/.gz/' * && gzip -d *
で上から順にフラグのようなものを投げると1番上がフラグでした。
SECCON{@]NL7n+-s75FrET]vU=7Z}
Programming 100
ncで指定されたサーバに接続すると
複数の数字と最大値は?最小値は?
という問いが来るのでそれに答えていくとフラグを取ることができました。
#!/usr/bin/env python # -*- coding: utf-8 -*- #programming100.py s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((hostname, port)) while True: data = s.recv(2048) if data == '': break num = repr(data).split(r'\n')[0] num = num[1:].split(', ') is_maximum = repr(data).split(r'\n')[1] if 'maximum' in is_maximum: ans_num = org_max(num) else: ans_num = org_min(num) s.sendall(str(ans_num)) s.shutdown(socket.SHUT_WR) s.close()
一応フラグは取れたのですが、上のプログラムは
読み辛い、かつ お行儀のよくないプログラムで異常終了で止まりますww