FEAT:🚩 Daily-AlpacaHack 「private method」easy
PythonにおけるPrivateメソッドに対する名前修飾
FEAT:🚩 Daily-AlpacaHack 「private method」easy
20260709-daily_alpaca-misc-easy-private_method
Summary
本問は,PythonでのPrivateメソッドに対する名前修飾を用いる問題です.
- Category: Misc
- Description: privateなメソッドは呼び出せないはず…
- Tools & TechStack:
- Python
- Release: 2026/07/09
階層構造
1
2
3
4
5
6
.
├── app.py
├── compose.yaml
└── Dockerfile
1 directory, 3 files
ソースコードの調査
Main クラスが定義されており,Publicなメソッド alpaca と,Privateなメソッド __flag が定義されています. ここで,Main クラス以下に対して,任意の関数を呼び出すことができる実装になっています.
- 正規表現の解析:
\w+\(\)\w+: 1文字以上の英数字・アンダースコアの連続にマッチ\(\): 括弧をエスケープしているため,文字列の()にマッチ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re
class Main:
# public
def alpaca():
return "🦙"
# private
def __flag():
return "Alpaca{REDACTED}"
code = input(">>> Main.").strip()
if re.fullmatch(r"\w+\(\)", code):
print(eval(f"Main.{code}"))
else:
print("Nope")
名前修飾 (Name Mangling)
Pythonにおいて,メソッド名の接頭辞として __ を付けることでPrivateメソッドになります. これによって,外部からのアクセスが制限されます. 実際には,名前空間の衝突を避けるために名前修飾が行われ,内部でメソッド名が書き換えられます.
具体的には,クラス名の頭にアンダースコアを1つ付け,その後に元のプライベート変数やメソッド名を結合する形になります.
Fooクラスの__Barメソッドの名前修飾の例:_Foo__Bar
名前修飾を利用した関数実行
- Payload:
_Main__flag()
1
2
3
$ python3 app.py
>>> Main._Main__flag()
Alpaca{REDACTED}
Post-Mortem & Dead ends
References
This post is licensed under CC BY 4.0 by the author.