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