Rattle – 以太坊EVM二进制分析框架
大多数智能合约没有经过验证的源代码,但人们仍然信任它们来保护加密货币。更重要的是,几个大型托管智能合约曾发生安全事件。区块链上存在的合约安全性应该能够被独立验证。
以太坊虚拟机(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,因此常量被折叠,不需要的块被移除。
|
|
Rattle CLI界面为每个可识别和提取的函数生成graphviz文件。
如您所见,Rattle将numberOfMonarchs()函数优化到仅剩12条指令。Rattle消除了72%的指令,分配了可视觉跟踪的寄存器,并移除了整个基本块。更重要的是,Rattle恢复了使用的存储位置和函数的ABI。
Rattle将帮助组织和个人研究他们正在交互的合约,并对合约安全性建立知情的信任程度。如果您的合约源代码不可用或无法验证,那么您应该运行Rattle。
在我们的GitHub上获取Rattle并亲自尝试。
如果您喜欢这篇文章,请分享: Twitter | LinkedIn | GitHub | Mastodon | Hacker News