BCTF 2018 Writeup

この大会は2018/11/27 15:00(JST)~2018/11/29 3:00(JST)に開催されました。
今回もチームで参戦。結果は 876点で318チーム中41位でした。
自分で解けた問題をWriteupとして書いておきます。

IRC checkin (Misc)

freenodeで#BCTFチャネルに入る。

21:48 *topic :  BCTF 2018 will start at Nov 27 10:00(UTC+4), Beijing Time 14:00(UTC+8) at https://bctf.xctf.org.cn (if you had registered xctf account, just use it, otherwise please register one and create a team to play) | Flag format: bctf{.+}, if not will be clarified in challenge description. The flag is BCTF{Welcome_to_BCTF2018}
BCTF{Welcome_to_BCTF2018}

guess_polynomial (Crypto)

n: 100以上120以下のランダム整数
coeffリスト: n個の配列(0以上[1をnビットシフトした値]以下のランダム整数)
x: 入力

calcでxを掛けながら配列の各要素に対して和を取る。この和の値を表示する。coeffを推測できればフラグが表示される。
x を2**120より大きい値を指定すれば、簡単に推測できそう。

import socket

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

def guess_nums(num, x):
    guess = []
    while True:
        guess.append(str(num % x))
        num /= x
        if num == 0:
            break
    guess.reverse()
    return guess

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('39.96.8.114', 9999))

coeff = 2**128

for i in range(10):
    data = recvuntil(s, 'coeff: ')
    print data + str(coeff)
    s.sendall(str(coeff) + '\n')
    data = recvuntil(s, '\n').strip()
    print data

    num = int(data[17:])
    guess = guess_nums(num, coeff)
    guess = ' '.join(guess)
    data = recvuntil(s, 'coeff!')
    print data + guess
    s.sendall(guess + '\n')

data = recvuntil(s, '\n').strip()
print data
BCTF{One_T1m3_10_Gue33_Coeff_1s_0K!}