Rattle:以太坊EVM二进制分析框架,让智能合约审计更高效

Rattle是一个针对以太坊EVM字节码的静态分析框架,可将堆栈机转换为SSA形式,优化指令并恢复控制流图,提升智能合约的安全审计效率与可读性。

Rattle – 以太坊EVM二进制分析框架

Ryan Stortz
2018年9月6日
区块链, 程序分析

大多数智能合约没有经过验证的源代码,但人们仍然信任它们来保护加密货币。此外,一些大型托管智能合约曾发生安全事件。区块链上合约的安全性应可独立验证。

以太坊虚拟机(EVM)字节码

以太坊合约被编译为EVM(以太坊虚拟机)字节码。随着区块被挖出,EVM被执行,其最终状态被永久编码到区块链中。每个人都可以访问区块链上每个智能合约的编译EVM代码,但直接审查EVM并不容易。

EVM是一种RISC哈佛架构堆栈机,在计算机架构中相当独特。EVM有大约200条指令,这些指令在堆栈上推送和弹出值,偶尔对它们执行特定操作(例如,ADD从堆栈中取两个参数,将它们相加,并将结果推回堆栈)。如果您熟悉逆波兰表示法(RPN)计算器,那么堆栈机会显得类似。堆栈机易于实现但难以逆向工程。作为逆向工程师,在查看堆栈机时,我没有可以标记和跟踪的寄存器、局部变量或参数。

基于这些原因,我创建了Rattle,这是一个将堆栈机转换为无限寄存器SSA形式的框架。

Rattle

Rattle是一个EVM二进制静态分析框架,旨在处理已部署的智能合约。Rattle接受EVM字节字符串,使用流敏感分析恢复原始控制流图,将控制流图提升为SSA/无限寄存器形式,并优化SSA——移除DUP、SWAP、PUSH和POP指令。将堆栈机转换为SSA形式可移除60%以上的EVM指令,并为希望阅读其所交互智能合约的用户提供更友好的界面。

演示

作为示例,我们将分析臭名昭著的King of Ether合约。

首先在Ethersplay中——这是我们用于分析以太坊智能合约的Binary Ninja插件:

图1:由Ethersplay反汇编的King of Ether合约

在Ethersplay中,我们可以看到有43条指令和5个基本块。大多数指令是纯堆栈操作指令(例如PUSH、DUP、SWAP、POP)。在块中散布着有趣的指令(例如CALLVALUE、SLOAD等)。

现在,使用Rattle分析合约并观察同一函数的输出。我们运行带优化的Rattle,因此常量被折叠,不需要的块被移除。

1
$ python3 rattle-cli.py --input inputs/kingofether/KingOfTheEtherThrone.bin -O

Rattle CLI接口为每个可以识别和提取的函数生成graphviz文件。

图2:由Rattle恢复的King of Ether合约

如您所见,Rattle将numberOfMonarchs()函数优化到仅12条指令。Rattle消除了72%的指令,分配了可以视觉跟踪的寄存器,并移除了整个基本块。更重要的是,Rattle恢复了使用的存储位置和函数的ABI。

Rattle将帮助组织和个人研究他们正在交互的合约,并为合约的安全性建立知情的信任程度。如果您的合约源代码不可用或无法验证,那么您应该运行Rattle。

在我们的GitHub上获取Rattle并亲自尝试。

如果您喜欢这篇文章,请分享:
Twitter、LinkedIn、GitHub、Mastodon、Hacker News


页面内容
以太坊虚拟机(EVM)字节码
Rattle
演示
近期文章
非传统创新者奖学金
在PajaMAS中劫持多代理系统
我们构建了MCP一直需要的安全层
利用废弃硬件中的零日漏洞
EthCC[8]内幕:成为智能合约审计员
© 2025 Trail of Bits.
使用Hugo和Mainroad主题生成。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计