TSG CTF 2020 Writeup

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

Sanity Check (Warmup)

Discordに入り、#readmeチャネルのメッセージを見ると、フラグが書いてあった。

TSGCTF{the_blue_bird_is_in_your_cage_so_stay_home_and_dont_miss_it!}

Beginner's Crypto (Crypto)

・フラグの長さは50バイト以下
・フラグの数値化を10000シフトすると、1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576で終わる。

これは以下のように表現できる。

(x * (2**10000)) % (10**175) = A
x * (2**10000) = A mod (10**175)
pow(x * (2**10000), 1, 10**175) = A

RSA暗号の要領で、x * (2**10000) = Bを求める。

pow(x, 1, 10**175) * pow(2, 10000, 10**175) = B

2と10**175が互いに素でないので、そのままではxを計算できない。flagが50バイト(400bit)以下で、5**175以下であることからmodulusを5**175に変えて計算する。

from Crypto.Util.number import *

A = 1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576
n1 = pow(10, 175)
phi1 = 1 * 4 * pow(10, 174)

d1 = inverse(1, phi1)
m = pow(A, d1, n1)

n2 = pow(5, 175)
phi2 = 4 * pow(5, 174)

m = (m * inverse(pow(2, 10000, n2), n2)) % n2
flag = long_to_bytes(m)
print flag
TSGCTF{0K4y_Y0U_are_r3aDy_t0_Go_aNd_dO_M0r3_CryPt}

Survey (Cooldown)

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

TSGCTF{PERFECT_INFRASTRACTURE}