计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-blockchain【效率与协作】EVM 智能合约逆向:字节码反编译、漏洞分析。 触发词:智能合约、EVM、Solidity、字节码、合约漏洞、ABI、Solana、Move、BPF
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
cast call/cast code/cast storage);任何写链/部署/动态验证默认本地 anvil 或隔离网络([[re-analyze/platform-tips]] 沙箱最高原则);合约分析基本静态,按「静态优先」执行apt install python3 / dnf install python3 / pacman -S pythonbrew install python3;Windows: choco install pythonpython3 --version(本技能脚本均为 Python 3)~/.foundry/bin,含 forge/cast/anvil/chisel): curl -L https://foundry.paradigm.xyz | bash && foundryupbrew install foundry(官方 Homebrew formula,含四件套)foundry-bin(yay -S foundry-bin 等);注意 pacman -S foundry 是无关的 GNOME Builder 工具包,别装错;Debian/Ubuntu/Fedora 无官方包——用官方安装器cast --version && anvil --versionpip install web3(官方 PyPI;当前 8.x 要求 Python >=3.10,PyPI requires-python 为 <4,>=3.10——7.x 才支持 3.8。Python 3.8/3.9 环境需 pin 7.x)python3 -c "import web3; print(web3.__version__)"pip install panoramix-decompiler(官方 PyPI 0.6.x,要求 Python 3.9–3.11);维护更活跃的 fork 为 panoramix-decompiler-abi,两者都提供 panoramix 命令panoramix --help(或 python3 -m panoramix --help)panoramix <hex> --abi 反编译;传合约地址则需 WEB3_PROVIDER_URI 环境变量(从链上拉字节码);输出伪码 .pan/反汇编 .asm 写到 cache 目录pip install pyevmasm(官方 PyPI);验证: pyevmasm -d 0x6001600101 输出指令行cast disassemble <hex>(foundry 自带,同一用途)cargo install --locked echidna(官方仓库无发行版包;Arch 有 AUR 包);验证: echidna --versionhevm --versionpip install solc-select(Python 3)+ solc-select install 0.8.28(官方 PyPI/编译产物下载);或 solc-bin 官方二进制(Linux x86 静态包)solc --version按顺序执行,每步产物(字节码/选择器表/伪码/asm)存档 sha256 + 路径([[re-ioc]] 证据链)。
合约字节码获取(链上/文件):
# 链上(RPC 节点;公开 RPC 或自有节点)
cast code 0xDEAD... --rpc-url https://eth.llamarpc.com > code.hex
# 文件(.bin/.hex 文本或二进制)
xxd -r -p code.hex > code.bin && file code.bin && xxd code.bin | head -2
sha256sum code.bin > code.sha256
0x6080... PUSH1 0x80 分配内存)——Etherscan 的 Bytecode 页是 creation、Deployed Bytecode 页是 runtime;分析业务逻辑用 runtimecast call/cast code/cast storage 只读安全;写链/交易类操作默认本地 anvil 起测试链ABI 恢复(函数选择器/签名):
# 从字节码提取 PUSH4 选择器常量(4 字节 = keccak256(signature)[:4])
cast disassemble "$(cat code.hex)" | grep -E 'PUSH4' | awk '{print $NF}' | sort -u > selectors.txt
# 对照签名库(4byte.directory / etherface 在线服务)
while read s; do echo -n "$s "; cast 4byte "$s"; done < selectors.txt
# 已知签名本地计算(签名必须规范化,见坑 1)
cast sig "transfer(address,uint256)"
cast sig "balanceOf(address)"
反编译(panoramix 思路:disasm→流程):
panoramix "$(cat code.hex)" --abi > contract.pan # 伪码(可读性优先)
cast disassemble "$(cat code.hex)" > contract.asm # 精确指令流(交叉验证真值)
# 按地址反编译(需节点): WEB3_PROVIDER_URI=<rpc> panoramix 0xDEAD...
PUSH4 sel EQ PUSH2 off JUMPI 模式,位于字节码开头 ~0x00-0x1f 区域)→ 伪码粗读 → 关键函数回 asm 精读逻辑还原(存储布局/状态变量):
# 链上存储读取(状态变量从 slot 0 起、每槽 32 字节)
cast storage 0xDEAD... 0 --rpc-url <rpc>
cast storage 0xDEAD... 1 --rpc-url <rpc>
# 动态数组/映射槽位 = keccak256 派生(见坑 2 公式)
cast call 0xDEAD... "owner()(address)" --rpc-url <rpc> # 公开变量 getter
# 无源码:从反编译的 SSTORE/SLOAD 常量与 getter 推断语义
grep -E 'SSTORE|SLOAD' contract.asm | head
bool/uint8/address 等可同槽打包)、动态数组 slot = keccak256(slot_index)、mapping slot = keccak256(key ++ slot_index);有源码时 solc --storage-layout 出权威 JSON 对照cast call 结果反推变量类型与槽位漏洞分析(重入/整数溢出/权限):
grep -cE 'CALL|DELEGATECALL|CALLCODE' contract.asm # 外部调用面(重入/交互边界)
grep -E 'ADD|MUL|SUB' contract.asm | head # 算术运算(<0.8 无内置溢出检查)
grep -E 'CALLER' contract.asm | head # 调用者检查(onlyOwner 权限)
unchecked 块anvil 本地复现攻击序列流程与 EVM 同构(字节码反编译 → 漏洞分析),指令集与资源模型不同——先识别运行时,再按对应路径走。
llvm-objdump -d(BPF 反汇编)或专用反编译器;分析重点——程序账户与指令调度(CPI 跨程序调用链)、账户数据布局(结构体偏移)move disassemble);分析重点——资源模型(对象/能力)对漏洞面的影响(转账/所有权逻辑)、模块依赖图cast 4byte 返回多个候选签名,或按猜的签名 cast call 解析失败/结果错位;原因——选择器是 keccak256(signature) 前 4 字节,碰撞存在(恶意变体/已知碰撞案例),且大量签名未入库;对策——cast sig 只对规范化签名成立(参数间无空格、uint256 不写 uint、地址小写完整),候选签名用 CALLDATASIZE 比较(参数长度分派)、回退逻辑(fallback 处理)、存储访问模式消歧;最终以完整签名 keccak256 比对确认solc --storage-layout 出 JSON 对照(编译器版本要一致);无源码: 从反编译的 SSTORE 常量 + getter 行为 + 值大小推断类型,标注置信度不硬猜;动态数组/mapping 槽位按 keccak256 公式算(步骤 4),别线性加一cast storage <addr> 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc --rpc-url <rpc>(管理员槽 0xb53127684a568b3173ae13bae8d486943e0793e1d5dccd29778a66c42e1c39d),非标准代理从反编译定位 SLOAD 常量槽位读实现地址;再 cast code <实现地址> 分析实现;实现地址可变=可升级,结论标注读取时点cast disassemble 指令级精读(分派表定位 → 逐指令语义 → 存储/调用模式);多工具交叉(panoramix + cast disasm + echidna 行为验证);结论标注置信度与验证方式