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、栈操作和 storage 访问。

5. 陷阱的原因

EVM 字节码是低级表示,没有 Solidity 源码的语义信息。需要理解 EVM 操作码、ABI 编码和 Solidity 编译器生成的代码模式。

6. 如何解决

使用工具辅助分析:

  • cast selectors 列出所有函数选择器
  • cast storage 读取存储槽位
  • Python 脚本解析 dispatch table 和函数体
  • 关注 revert 字符串(存储在字节码末尾,提供线索)

7. 技术要点

要点说明
EVM 字节码分析理解 dispatch table、函数选择器、JUMPDEST 结构
函数分发Solidity 使用二分查找 + 函数选择器的 dispatch 模式
反向工程从字节码推导 Solidity 源码逻辑
cast 工具cast code, cast selectors, cast 4byte, cast storage

Built with AiAda