Appearance
S1C8: The Unverified
1. 问题
合约在区块浏览器上未验证(无源代码)。需要通过分析字节码来理解合约逻辑,然后调用正确的函数。
2. 原因
合约故意不公开源码,玩家需要具备 EVM 字节码分析能力。
3. 方案
- 使用
cast code获取部署字节码 - 通过 4byte 选择器解码函数签名
- 分析函数分发表(dispatch table)和函数逻辑
- 构造正确的 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 |