Writeup: AlpacaHack Round 4 - pytecode

TL;DR §

  • PickleバイトコードでPythonのコードオブジェクトを構築しながらフラグをチェックする
    • co_argcountとco_codestring以外は固定でこれらをSETITEMSオペコードを実行してセットしたものをNEWOBJオペコードでインスタンス化している
  • 構築されるコードオブジェクトにもいくらかの難読化が施されている
    • co_consts や co_names が空: 定数等が変数として使えないため、引数の数値同士を除算、減算する形で1や0を作ってそこを起点に他の数値も強引に作っている
    • co_varnamesが全てクエスチョン ("?") になっている
  • 構築されるコードオブジェクトとその引数を取得して動作を逆アセンブラと気合で解析し、フラグを逆算する
Read more  ↩︎

AARがある時のKASLR Bypass (SECCON Beginners CTF 2023 - driver4b with KASLR)

まえがき §

最近Kernel Exploitationを学び始めてPAWNYABLE!のLK01: Holsteinをv4まで取り組み、何かCTFの問題を解いてみようと思ったので、SECCON Beginners CTF 2023からdriver4bという問題を選んだ。

Read more  ↩︎

PickleとPythonのPolyglotを作る

まえがき §

労働していると「時間は大きく割かないが調査と思考は要求するパソカタパズル」程度でしか脳味噌が動いてくれない。というわけでそのようなパズルとして今回はPickleでPolyglotを構成する。具体的にはpickle.loads()に渡しても組み込み関数のevalに渡してもシェルが起動する(os.system("/bin/sh")が実行される)バイト列を構成する。

Read more  ↩︎

Pickleでランレングス圧縮をやる

まえがき §

Pythonでオブジェクトをシリアライズする手段としてPickleが知られている。こいつはスタックマシンを実行する形でデータを構築していくという設計をしている上に内部でPythonの関数を呼べるため、一部のCTFプレイヤーのおもちゃとして遊ばれることがある。出題形式として、Pickleでフラグチェッカーを書いてRevで出したり制約の下でRCEをすることを求めてMisc/Pwnで出されたりすることがあり、前者のRevに関しては私もSECCON 2023で出題している。

最近またパソカタのやる気を取り戻した私だが、以前同様慢性的なネタ不足に苦しめられており、Pickleに関しては前述のSECCONにおける出題以降、特にアイデアが出ていなかった。そんな中、Pickleとは関係ない問題のペイロードを(長さ制限もないのに)削減するという経験をした結果、Pickleのバイトコードを普通にシリアライズするより短くするというアイデアが生じたのでひとまず簡単なランレングス圧縮を実現することにした。

Read more  ↩︎

Writeup: *CTF 2019 - oob-v8

Read more  ↩︎