jailCTF 2024 - parity 1/2
Challenge
parity-1
クォートの数が偶数でなければならない。
code = input()if code.count('"') % 2 != 0 or code.count("'") % 2 != 0: print("Parity error!") exit()eval(code)parity-2
さらに追加の制限あり。
Solution
parity-1 解法
クォートを偶数個使用してペイロードを構築:
# 文字列を使わずに属性アクセス().__class__.__bases__[0].__subclasses__()
# chr() で文字列を構築__import__(chr(111)+chr(115)).system(chr(105)+chr(100))parity-2 解法
Unicode 文字を使用してフィルタをバイパス:
# 全角クォートは通常のクォートとしてカウントされないeval(input())Unicode正規化の利用
# NFKC 正規化される文字'abc' # → 'abc' として認識Technical Details
Pythonの識別子はNFKC正規化される:
import unicodedataunicodedata.normalize('NFKC', 'eval') # 'eval'これにより、全角文字やその他のUnicode文字を使用してフィルタをバイパスできる。
Flag
jail{...}
References
- jailCTF 2024 Official
- PEP 3131 (Python Unicode Identifiers)