Blaze CTF 2019 Writeup

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