Skip to content
This repository was archived by the owner on May 5, 2026. It is now read-only.

tadanobutubutu/func-array-solve

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

func-array-solve

Important

Solved with Google Antigravity この問題は Google の AI コーディングアシスタント Antigravity を活用して解決されました。

Daily AlpacaHack "func-array" writeup and solution.

概要

  • 問題名: func-array
  • ジャンル: Pwn (Binary Exploitation)
  • 難易度: Easy
  • リンク: Daily AlpacaHack

使用ツール

  • pwntools: Pythonベース of CTF向けフレームワーク。
  • checksec: バイナリのセキュリティ保護機能を調べるツール。
  • objdump: バイナリを逆アセンブルして構造を確認するツール。

脆弱性詳細

1. 配列の境界チェック欠如 (Out-of-Bounds Indexing)

プログラム内では、関数ポインタの配列 alpaca_functions がスタック上に配置されています。ユーザーが入力したインデックス choice を使ってこの配列から関数を呼び出しますが、インデックスが 02 の範囲内であるかどうかのチェックがありません。

2. スタック上の関数ポインタ呼び出し

alpaca_functions[choice]() は、スタック上の特定のアドレスにある値を読み取り、それをアドレスとしてジャンプ(呼び出し)します。スタック上には、関数ポインタだけでなく、戻りアドレスやベースポインタなどの重要な情報も存在します。

構成図 (Memory Layout)

graph TD
    subgraph Stack
        direction BT
        choice["choice (rbp-0x24)"]
        func0["alpaca_functions[0] (rbp-0x20)"]
        func1["alpaca_functions[1] (rbp-0x18)"]
        func2["alpaca_functions[2] (rbp-0x10)"]
        canary["Stack Canary (rbp-0x08)"]
        rbp["Saved RBP (rbp)"]
        ret["Return Address (rbp+0x08)"]
    end
    
    choice_input -- "5" --> index
    index -- "Index 5 points to Return Address" --> ret
    ret -- "Points to main code calling win()" --> win_call
Loading

解決手順

  1. checksec でバイナリを確認したところ、PIE (Position Independent Executable) が無効であることが分かりました。これにより、関数のアドレスが固定されます。
  2. objdumpvuln 関数のスタック構成を確認。alpaca_functions[0]rbp - 0x20 にあり、vuln 関数の戻りアドレスは rbp + 0x08 にあります。
  3. インデックスを計算すると、(0x08 - (-0x20)) / 8 = 5 となります。インデックス 5 を指定すると、alpaca_functions[5] はスタック上の戻りアドレスを関数ポインタとして読み込みます。
  4. main 関数では、vuln の呼び出し直後に win 関数の呼び出しがスケジュールされています。そのため、戻りアドレスは win を呼び出す直前のコードを指しており、これを利用して win を実行させることができます。

解決スクリプト

solve.pyを参照してください


用語解説

  • Pwn (Pwnable): プログラムの脆弱性を突き、意図しない動作(シェルの起動など)をさせる攻撃。
  • 関数ポインタ (Function Pointer): 関数のアドレスを保持する変数。この変数を「呼び出す」ことでその関数を実行できる。
  • スタック (Stack): 関数のローカル変数や戻りアドレスを一時的に保存するメモリ領域。
  • 戻りアドレス (Return Address): 関数が終了した後に戻るべき、呼び出し元の次の命令のアドレス。
  • PIE (Position Independent Executable): 実行のたびにアドレスをランダム化する機能。今回は無効だったため、アドレスが固定でした。

About

Daily AlpacaHack "func-array" writeup and solution

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages