この大会は2019/4/21 5:20(JST)~2019/4/26 1:20(JST)に開催されました。
今回もチームで参戦。結果は2520点で250チーム中14位でした。
自分で解けた問題をWriteupとして書いておきます。
Blaze (MISC)
freenodeで#hackerswhoblazeチャネルに入る。
06:13 *topic : BLAZE 4/20 4:20 || blizz it || http://ctf.420blaze.in/ || sftp || https://www.youtube.com/watch?v=1LGDN4HVyQ0 | blaze{}
blaze{}
Hashishe cryptos (CRYPTO)
Elgamal暗号で、暗号処理は以下のようになっている。
y = g**x mod p c1 = g**r c2 = m*(y**r)
rにより、c1は固定。c2はmod pの空間の中で、mに比例する。m = 1 を指定したときのC2の何倍かでflagを求める。以下のような計算になる。
c2 = C2 * flag mod p flag = c2 * inverse(C2, p)
import socket import re from Crypto.Util.number import * def recvuntil(s, tail): data = '' while True: if tail in data: return data data += s.recv(1) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('chal.420blaze.in', 42003)) data = recvuntil(s, 'encrypt:\n').rstrip() print data pattern = 'p=(.+)\n g=.+c2=(.+)\n' m = re.search(pattern, data, re.DOTALL) p = int(m.group(1)) c2 = int(m.group(2)) print '\x01' s.sendall('\x01\n') data = recvuntil(s, 'blaze it').rstrip() print data pattern = 'C2=(.+)\n' m = re.search(pattern, data) C2 = int(m.group(1)) flag = (c2 * inverse(C2, p)) % p flag = long_to_bytes(flag) print flag
blaze{i_wuz_bl4z1n_s0_much_i_r3used_m4h_k3ys}