UACTF 2022 Writeup

この大会は2022/7/30 10:30(JST)~2022/8/1 10:30(JST)に開催されました。
今回もチームで参戦。結果は709点で431チーム中90位でした。
自分で解けた問題をWriteupとして書いておきます。

Welcome (misc)

問題にフラグが書いてあった。

UACTF{w31c0m3_70_u4c7f}

Sanity Check (reversing)

$ strings sanity-check | grep UACTF{
UACTF{N3V3R_G0NN4_L37_Y0U_D0WN}
UACTF{N3V3R_G0NN4_L37_Y0U_D0WN}

Colour Blind (forensics)

StegSolveで開き、Random colour mapを見たら、フラグが現れた。

UACTF{r37urn_0f_7h3_c0l0r_m31573r}

Non-textual Troubles (crypto)

1バイトずつランダムな値とXORをして暗号化しているが、seedを使っているので、ランダム値を鍵として復号する。

#!/usr/bin/env python3
from random import seed, randrange

seed(True, version=2)

with open('ciphertext.txt', 'r', encoding='utf-8') as f:
    ciphertext = f.read()

flag = ''
for char in ciphertext:
    A = ord(char)
    B = randrange(256)
    flag += chr(A ^ B)
print(flag)
UACTF{b4d_h4b175_l34d_70_py7h0n2}

Peter works at Bendigo (crypto)

クレジットカードはMasterCardで一部がマスクされた番号は以下のようになっている。

XXXX XX66 8X12 5X57

BendigoのMasterCardなので、最初の6桁の発行者識別番号は519244。あと2桁はLuhnアルゴリズムで妥当な数値の組み合わせを探す。

#!/usr/bin/env python3
def check_number(digits):
    _sum = 0
    alt = False
    if digits[0] == "0":
        return False
    for d in reversed(digits):
        d = int(d)
        assert 0 <= d <= 9
        if alt:
            d *= 2
            if d > 9:
                d -= 9
        _sum += d
        alt = not alt
    return (_sum % 10) == 0

for i in range(10):
    for j in range(10):
        number = '519244668%d125%d57' % (i, j)
        if check_number(number):
            flag = 'UACTF{%s}' % number
            print(flag)

この結果、以下の複数の組み合わせがあるので、順にフラグを投入してみる。

UACTF{5192446680125657}
UACTF{5192446681125557}
UACTF{5192446682125457}
UACTF{5192446683125357}
UACTF{5192446684125257}
UACTF{5192446685125157}
UACTF{5192446686125057}
UACTF{5192446687125957}
UACTF{5192446688125857}
UACTF{5192446689125757}

この結果、下から3つ目がフラグとして通った。

UACTF{5192446687125957}

Feedback (misc)

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

UACTF{thanks_for_playing}