Skip to content
On this page

S1C8: The Unverified

1. 問題

コントラクトはブロックエクスプローラー上で未検証です(ソースコードなし)。バイトコードを分析してコントラクトのロジックを理解し、正しい関数を呼び出す必要があります。

2. 原因

コントラクトは意図的にソースコードを公開しておらず、プレイヤーは EVM バイトコード分析能力を持つ必要があります。

3. 方案

  1. cast code を使用してデプロイ済みバイトコードを取得する
  2. 4byte セレクターを通じて関数シグネチャをデコードする
  3. 関数ディスパッチテーブル(dispatch table)と関数ロジックを分析する
  4. 正しい calldata を構築してトランザクションを送信する
bash
# バイトコードを取得
cast code <CHALLENGE> --rpc-url $RPC
# セレクターをデコード
cast 4byte <SELECTOR>
# raw calldata を送信
cast send <CHALLENGE> <CALLDATA>

4. 遭遇したトラップ

バイトコード分析の複雑さ: 未検証コントラクトでは、JUMPDEST、スタック操作、ストレージアクセスを手動で追跡する必要があります。

5. トラップの原因

EVM バイトコードは低レベルの表現であり、Solidity ソースコードの意味情報を持ちません。EVM オペコード、ABI エンコーディング、および Solidity コンパイラが生成するコードパターンを理解する必要があります。

6. 解決方法

ツールを使用して分析を補助します:

  • cast selectors ですべての関数セレクターをリストアップ
  • cast storage でストレージスロットを読み取り
  • Python スクリプトで dispatch table と関数本体を解析
  • revert 文字列(バイトコード末尾に格納され、手がかりを提供)に注目

7. 技術ポイント

ポイント説明
EVM バイトコード分析dispatch table、関数セレクター、JUMPDEST 構造の理解
関数ディスパッチSolidity はバイナリサーチ + 関数セレクターのディスパッチパターンを使用
リバースエンジニアリングバイトコードから Solidity ソースコードロジックを導出
cast ツールcast code, cast selectors, cast 4byte, cast storage

Built with AiAda