Hack The Vote 2016 Writeup

この大会は2016/11/5 8:00(JST)~2016/11/7 8:00(JST)に開催されました。
今回もチームで参戦。結果は601点で1030チーム中116位でした。
自分で解けた問題をWriteupとして書いておきます。

Sanity (Vote 1)

問題にフラグが書かれている。

flag{th3r3_1s_0nly_on3_ch0ic3}

Vermatrix Supreme (Crypto 100)

暗号のコードが与えられ、読み解くと処理の概要は以下の通りであることがわかる。

・IV の文字とseedのASCIIコードを連結
・連結した配列の長さが9の倍数になるように0をパディングする。
・9バイトごとに&や|、~の計算をし、その結果とseedが表示される。
・IVを求め、定型フォーマットで指定すれば、フラグが表示される。

IVはXORを繰り返せば、求められる。コードは以下の通り。

#!/usr/bin/env python
import socket
import re

def pad(s):
    if len(s)%9 == 0:
        return s
    for i in xrange((9-(len(s)%9))):
        s.append(0)
    return s

def genBlockMatrix(s):
    outm = [[[7 for x in xrange(3)] for x in xrange(3)] for x in xrange(len(s)/9)]
    for matnum in xrange(0,len(s)/9):
        for y in xrange(0,3):
            for x in xrange(0,3):
                outm[matnum][y][x] = s[(matnum*9)+x+(y*3)]
    return outm

def copyMatrix(m):
    copym = [[0 for i in range(3)] for i in range(3)]
    for y in xrange(3):
        for x in xrange(3):
            copym[y][x] = m[y][x]
    return copym

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('vermatrix.pwn.democrat', 4201))

data = s.recv(256)
print data

pattern = 'SEED: (.+)\n(.+)\n(.+)\n(.+)\n'
m = re.search(pattern, data)
seed = m.group(1)
seed_blocks = genBlockMatrix(pad([ord(c) for c in seed]))

matrixz = []
matrixz.append(map(int, m.group(2).split(' ')))
matrixz.append(map(int, m.group(3).split(' ')))
matrixz.append(map(int, m.group(4).split(' ')))

matrix_tmp = copyMatrix(matrixz)
matrix_tmp2 = [[0 for i in range(3)] for i in range(3)]
for i in range(len(seed_blocks)-1, -1, -1):
    for row in range(3):
        for col in range(3):
           matrix_tmp2[row][col] = matrix_tmp[col][row] ^ seed_blocks[i][col][row]
    matrix_tmp = copyMatrix(matrix_tmp2)

ans = ''
for row in range(3):
    for col in range(3):
        ans += str(matrix_tmp2[row][col])
        ans += ','

ans = ans[:-1]
print ans
s.sendall(ans + '\n')

data = s.recv(256)
print data
flag{IV_wh4t_y0u_DiD_Th3r3}