この大会は2016/9/3 9:00(JST)~2016/9/5 9:00(JST)に開催されました。
今回もチームで参戦。結果は560点で835チーム中94位でした。
自分で解けた問題をWriteupとして書いておきます。
Welcome!! (Misc, Warmup 10)
問題文にフラグが書いてある。
TWCTF{Welcome_To_TW_MMACTF!!}
Twin Primes (Crypto, Warmup 50)
RSA暗号で復号するのに必要な情報はn=p*qの場合の(p-1)*(q-1)とe。
与えられている情報はn1(=p*q)とeのペアと、n2(=(p+2)*(q+2))とeのペア。
それぞれ簡単にオイラー関数の値を計算できるので、n2の方で復号した後にn1の方で復号する。
with open('encrypted', 'r') as f: c = int(f.read().strip()) with open('key1', 'r') as f: n1 = int(f.readline().strip()) e1 = int(f.readline().strip()) with open('key2', 'r') as f: n2 = int(f.readline().strip()) e2 = int(f.readline().strip()) sum = (n2 - n1 -4) / 2 phi1 = n1 - sum + 1 phi2 = n1 + sum + 1 x = 0 while True: if (phi2 * x + 1) % e2 == 0: d = (phi2 * x + 1) / e2 break x = x + 1 m1 = pow(c, d, n2) x = 0 while True: if (phi1 * x + 1) % e1 == 0: d = (phi1 * x + 1) / e1 break x = x + 1 m = pow(m1, d, n1) flag = ('%x' % m).decode('hex').split('\0')[0] print flag
TWCTF{3102628d7059fa267365f8c37a0e56cf7e0797ef}
Super Express (Crypto 100)
encryptedが60桁の16進数。文字ごとにASCIIコードが計算されて、暗号化される。
暗号データが「805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9」なので、フラグは30文字。
またフラグはTWCTF{で始まり、}で終わる。
コードから逆の処理をしたり、ブルートフォースをするのが難しいため、わかる範囲から特徴を探す。
それぞれ暗号化の結果は以下のようになっている。[]内はASCIIコード。
T:[84]→0x80(=128) W:[87]→0x5e(=94) C:[67]→0xed(=237) F:[70]→0xcb(=203) {:[123]→0xbc(=188) }:[125]→0xf9(=249)
ASCIIコード順で2つ置きに217プラスして251で割って暗号化していそう。
([暗号コード] * 214 + 51) % 251で復号できるようだ。
crypt = '805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9' flag = '' for i in range(0, len(crypt), 2): code = int(crypt[i:i+2], 16) code = (code * 214 + 51) % 251 flag += chr(code) print flag
TWCTF{Faster_Than_Shinkansen!}