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