Rattle - 以太坊EVM二进制分析框架:将智能合约反编译为可读SSA形式

Rattle是一款专为以太坊智能合约设计的EVM二进制静态分析框架,通过流敏感分析恢复控制流图并将其转换为SSA形式,可消除60%以上的冗余指令,大幅提升合约可读性与安全性验证能力。

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插件用于分析以太坊智能合约):

在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文件。

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

应用价值

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

获取方式

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

[GitHub项目链接]


分享至: Twitter | LinkedIn | GitHub | Mastodon | Hacker News

本文内容生成基于Trail of Bits博客的技术文章,专注于EVM二进制分析框架Rattle的技术实现与应用价值。

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