m0leCon CTF 2020 Writeup

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

Sanity Check (misc)

問題の画像にフラグが書いてある。

ptm{w3lc0m3_70_m0l3C0n_2020!}

babyhash (crypto)

a = bytes_to_long(b'admin')
b = bytes_to_long(b'password')

server_hash = (pow(x, a, p) * pow(y, b, p)) % p

adminとpasswordのペア以外で、server_hashと同じになる。ユーザ名、パスワードを指定できたらフラグが表示される。以下のことを使って、ユーザ名とパスワードを指定する。

pow(x, a, p) = pow(x, (a + (p -1) / 2), p)
import socket
from Crypto.Util.number import *
from binascii import hexlify

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

p = 43401284375631863165968499011197727448907264840342630537012422089599453290392542589198227993829403166459913232354777490444915201356560807401141203961578150815557853865678753463969663318864902106651761912058979552119867603661163587639785030788676120329044248495611269533429749805119341551183130515359738240737511058829539566547367223386189286492001611298474857947463007621758421914760578235374029873653721324392107800911728989887542225179963985432894355552676403863014228425990320221892545963512002645771206151750279770286101983884882943294435823971377082846859794746562204984002166172161020302386671098808858635655367

a = bytes_to_long(b'admin')
b = bytes_to_long(b'password')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('challs.ctf.m0lecon.it', 8000))

username = hexlify(long_to_bytes(a + (p -1) / 2))
data = recvuntil(s, ':')
print data + username
s.sendall(username + '\n')

password = hexlify(long_to_bytes(b + (p -1) / 2))
data = recvuntil(s, ':')
print data + password
s.sendall(password + '\n')

for _ in range(5):
    data = recvuntil(s, '\n').rstrip()
    print data

実行結果は以下の通り。

CryptoLog.INC

--------------------------------------------------
Welcome, user!
Please login with valid credentials, checked by our crypto-evoluted system.
--------------------------------------------------



Username:abe6f67efeb8a86949b6c9ce7537e813b428e14a37a043bc7e96d2f31eb424be822daafff5452d34236144e61cdf41eb799a3dbef79bb168d32a9d82b4c5c70ea66a1628d966476d6f5c7652ff81d5d92f97419a0a95499a4f71641203f4eb62bd5ef8d7a2cfcc7252e780cd634c8c429a5e555fb3229bbc08a3d76bf02d37ca36a0544bcbb37f4fdcd9d02bdbaba139ec6cee764d1f880efa491d326ffb4601a688126f86085cb752bda95dffc514944c2cb1bd919d87808bc44088e1017a3da370abe8baea3cd1faae758cb2e0af4671790e9a1621b1928a45825cd19c034e3b8da95e1888fc37c0896e1f49854d4d489ee3891a1c017f70ad18d1556d55d1

Password:abe6f67efeb8a86949b6c9ce7537e813b428e14a37a043bc7e96d2f31eb424be822daafff5452d34236144e61cdf41eb799a3dbef79bb168d32a9d82b4c5c70ea66a1628d966476d6f5c7652ff81d5d92f97419a0a95499a4f71641203f4eb62bd5ef8d7a2cfcc7252e780cd634c8c429a5e555fb3229bbc08a3d76bf02d37ca36a0544bcbb37f4fdcd9d02bdbaba139ec6cee764d1f880efa491d326ffb4601a688126f86085cb752bda95dffc514944c2cb1bd919d87808bc44088e1017a3da370abe8baea3cd1faae758cb2e0af4671790e9a1621b1928a45825cd19c034e3b8da95e1888fc37c0896e1f49854d4d489ee3891a1c017fe10e8be3686f5ec7

Glad to see you, admin!


ptm{a_b1g_s0phi3_germ41n_pr1m3}
ptm{a_b1g_s0phi3_germ41n_pr1m3}