まえがき §
最近Kernel Exploitationを学び始めてPAWNYABLE!のLK01: Holsteinをv4まで取り組み、何かCTFの問題を解いてみようと思ったので、SECCON Beginners CTF 2023からdriver4bという問題を選んだ。
最近Kernel Exploitationを学び始めてPAWNYABLE!のLK01: Holsteinをv4まで取り組み、何かCTFの問題を解いてみようと思ったので、SECCON Beginners CTF 2023からdriver4bという問題を選んだ。
労働していると「時間は大きく割かないが調査と思考は要求するパソカタパズル」程度でしか脳味噌が動いてくれない。というわけでそのようなパズルとして今回はPickleでPolyglotを構成する。具体的にはpickle.loads()
に渡しても組み込み関数のeval
に渡してもシェルが起動する(os.system("/bin/sh")
が実行される)バイト列を構成する。
Pythonでオブジェクトをシリアライズする手段としてPickleが知られている。こいつはスタックマシンを実行する形でデータを構築していくという設計をしている上に内部でPythonの関数を呼べるため、一部のCTFプレイヤーのおもちゃとして遊ばれることがある。出題形式として、Pickleでフラグチェッカーを書いてRevで出したり、制約の下でRCEをすることを求めてMisc/Pwnで出されたりすることがあり、前者のRevに関しては私もSECCON 2023で出題している。
最近またパソカタのやる気を取り戻した私だが、以前同様慢性的なネタ不足に苦しめられており、Pickleに関しては前述のSECCONにおける出題以降、特にアイデアが出ていなかった。そんな中、Pickleとは関係ない問題のペイロードを(長さ制限もないのに)削減するという経験をした結果、Pickleのバイトコードを普通にシリアライズするより短くするというアイデアが生じたのでひとまず簡単なランレングス圧縮を実現することにした。
最近CTFで出題されているのか知らないが、いわゆるBrowser Exploitの特にJS Engine(今回はv8)を攻撃するものに入門し、初めて問題を解いた(正確には既存のWriteupをなぞった)のでWriteupを書く。
Pwnをある程度やったことがある人間1なら、JS Engine特有の初見殺し等に引っかかって自力で解くのは難しくても、何をやっているかはなんとなくわかるような問題だったので、そのような人が入門するきっかけとなれば(そして、それをきっかけにして難しい問題を解く人とWriteupが増えれば)幸いである。