EKOPARTY CTF 2015 Writeup

この大会は2015/10/22 21:00(JST)~2015/10/24 5:00(JST)に開催されました。
今回も個人で参戦。結果は340点で168位でした。
参加チームは356チームいたようですので、真ん中よりは良い順位で良かったです。
解けた問題3問をWriteupとして書いておきます。

Slogans (Trivia 50)

問題は EKO{ekopartyslogan2008_ekopartyslogan2009}。
EKOPARTYのSloganをググる

ここに書いてあった。
http://www.kungfoosion.com/2010/05/inventa-el-slogan-de-la-ekoparty.html

2008年が「Vi root y entre」。
2009年が「What if r00t was one of us?」。

EKO{Vi root y entre_What if r00t was one of us?}

SSL Atack (Trivia 90)

問題は Name of one of the SSL attacks presented at ekoparty。
EKOPARTYのSSL Atackについてググる

ここに3種類書いてあった。
http://dandylife.net/blog/index.php/2014/08/attacks-against-ssltls-beastcrimebreach/

この3種類を次々に入れてみる。
BEAST
・CRIME
・BREACH

EKO{BEAST}

XOR Crypter (Crypto 200)

問題は以下の暗号スクリプトで作成した暗号文「CjBPewYGc2gdD3RpMRNfdDcQX3UGGmhpBxZhYhFlfQA=」を復号するというもの。

import struct
import sys
import base64

if len(sys.argv) != 2:
    print "Usage: %s data" % sys.argv[0]
    exit(0)

data = sys.argv[1]
padding = 4 - len(data) % 4
if padding != 0:
    data = data + "\x00" * padding

result = []
blocks = struct.unpack("I" * (len(data) / 4), data)
for block in blocks:
    result += [block ^ block >> 16]

output = ''
for block in result:
    output += struct.pack("I", block)

print base64.b64encode(output)

XORは逆算は簡単なので、逆算して復号するスクリプトを書く。

import struct
import base64

enc = 'CjBPewYGc2gdD3RpMRNfdDcQX3UGGmhpBxZhYhFlfQA='
dec = base64.b64decode(enc)

units = []
for i in range(0, len(dec)/4):
    units += struct.unpack("I", dec[i*4:(i+1)*4])

result = []
for unit in units:
    result += struct.pack("I", unit ^ unit >> 16)

str = ""
for c in result:
    if c != '\x00':
         str += c
print str
EKO{unshifting_the_unshiftable}