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