SECCON 2020 Online CTF Writeup

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

koharu (crypto)

pの剰余環上でPQを因数分解する。多項式でなく、整数でも同じような定理があるが、試してみると、以下のことが成り立つことが分かった。

・C = (S * S) % PQ の場合
 power_mod(C, (NP-1)//2, P) = 1
・C =  (S * S * R) % PQ の場合
 power_mod(C, (NP-1)//2, P) = NP - 1

このことを使って、1ビットずつフラグを構成していく。

#!/usr/bin/env sage
#### from output.txt ####
p = 4832823609987476353
PQ = 2475361839038406994*x^128 + 1816580044636445865*x^127 + 771106714052997910*x^126 + 2532248969060743840*x^125 + 157159147928168793*x^124 + ... + 2337193413394346074
c = [2027712907546344021*x^127 + 2302822347078959804*x^126 + 596638239593512636*x^125 + 3973727976183683295*x^124 + ...
#########################
PR = PolynomialRing(GF(p), 'x')
n = PR(PQ)
P, Q = n.factor()
P, Q = P[0], Q[0]
NP = p**P.degree()
NQ = p**Q.degree()

bin_flag = ''
for i in range(len(c)):
    C = PR(c[i])
    print '[+]', bin_flag
    if power_mod(C, (NP-1)//2, P) == 1:
        bin_flag = '1' + bin_flag
    else:
        bin_flag = '0' + bin_flag

while True:
    if len(bin_flag) % 8 != 0:
        bin_flag = '0' + bin_flag
    else:
        break

flag = ''
for i in range(0, len(bin_flag), 8):
    flag += chr(int(bin_flag[i:i+8], 2))

print flag
SECCON{p01y-p01y-p3r0-p3r0-hy0ukun-p3r0p3r0}

Survey (misc)

アンケートに答えたら、フラグが表示された。

SECCON{Thank you for playing SECCON 2020 Online CTF}