Tokyo Westerns/MMA CTF 2nd 2016 Writeup

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