所以之后的文章还将先容Neo智能合约的反编译,将汇编代码反编译为可读性更高的高级语言。
配景
第二步是将ASM代码在反编译成我们更易领略的高级编程语言,好比C#可能python,这部门内容我将会在下一篇文章中举办先容。
反汇编的功效会存储在Dictionary<int, NeoCode>工具里。在输出反汇编功效时,再遍历Dictionary工具,然后挪用每个NeoCode内置的toString要领举办输出:
在对剧本举办反汇编的进程中,每识别到一个指令,就新建设一个NeoCode工具,再按照当前上下文对这个NeoCode举办初始化。
数据的范例是按照详细指令而判定的,好比若指令是SYSCALL,那么数据就是字符串,输出时就需要从hex转成string举办输出:
在开拓智能合约的时候,我们凡是会选择一种高级语言来编写合约逻辑代码,好比Solidity开拓合约、C++开拓EOS合约、C#开拓Neo合约等。在安详科研圈,智能合约安详方兴未艾。
因此合约的逆向阐明,直接从剧本出发对合约的成果举办成果阐明和安详阐明对付合约安详来说至关重要。
合约逆向主要分为两步,第一步也将是本文主要先容的进程,即将呆板指令翻译为开拓者可以领略的汇编指令,迁移到Neo的合约剧本,也就是将我们通过Neo编译器编译出的AVM智能合约剧本翻译成由NeoOpCode为主体的ASM代码。
编译后获得的合约剧本是:
以上进程已经具体表明白Neo合约反汇编的道理和流程,,接下来我们再通过一个案例来详细演示为什么需要合约逆向。2018年的顶会论文Enter the Hydra就提到,可以在运行时监测进攻、阐明裂痕;TEETHER,一个裂痕扫描东西,通过自动化阐明合约剧本乐成发明白815个裂痕合约;Erays,一款以太坊合约逆向东西,可以将合约剧本逆向为伪高级语言代码。另外较近的顶会成就尚有SODA,一款在线合约裂痕检测框架。
单看这个剧本,既看不出内里的逻辑布局,也不领略它所揭示的意思。假如此时黑客在个中改了一个指令,恐怕也很难发明:
作为开拓者,高级语言的智能合约很容易领略阐明,但编译后的剧本会有些难领略。好比,Neo官方提供一个用C#语言开拓的Domain合约,很容易读懂,但颠末编译器编译后的剧本却很难领略。以编译器编译后的一部门剧本为例:
另外对付安详开拓者来说,合约逆向是研究智能合约安详的一个重要途径。在安详规模通行的夺旗赛(CTF)类安详竞技角逐中,针对以太坊合约的逆向阐明已经成为一项正式的赛事题目,吸引一大批安详研究员进入合约安详的研究规模。纵然在科研学术圈,通过对智能合约举办逆向阐明,以大局限扫描线上合约大概存在的裂痕也是一个研究热点。
通过逆历来制止合约代码被改动,只是逆向的一个应用场景。还可以通过在多台设备上编译,举办功效比拟。其实逆向最重要的浸染照旧辅佐安详人员和开拓人员更好的领略合约执行道理,裂痕的产生道理以及养成安详的合约开拓习惯。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。