一种基于复用分析的EVM字节码控制流图构建方法技术

技术编号:39009598 阅读:8 留言:0更新日期:2023-10-07 10:40
本发明专利技术公开了一种基于复用分析的EVM字节码控制流图构建方法,包括:将输入的待分析字节码从十六进制形式反汇编成操作码和操作数;根据所述操作码划分基本块;使用递归迭代的策略,通过分析栈中关键特征数值,判断EVM字节码是否被复用,并构造控制流,重复判断直到没有新的控制流产生;输出构建完成的控制流图。本发明专利技术实现方法简便,轻量级开销低,能在短时间内为各种规模的EVM字节码完成复用分析并生成控制流图,生成的对复用敏感的控制流图有助于更精准的静态分析。更精准的静态分析。更精准的静态分析。

【技术实现步骤摘要】
一种基于复用分析的EVM字节码控制流图构建方法


[0001]本专利技术涉及静态分析和区块链安全领域,尤其涉及一种基于复用分析的EVM字节码控制流图构建方法。

技术介绍

[0002]随着区块链的高速发展,去中心化金融市场逐渐壮大。相比较传统的中心化金融,去中心化金融具有更透明,更公开的特点。链上的交易行为都通过执行部署的智能合约代码完成,不可被暗中篡改。
[0003]智能合约为去中心化金融提供了丰富的功能,并随着高速发展变得更复杂,规模更大,更易存在漏洞。而去中心化金融应用的智能合约中存在的任何潜在漏洞,都会造成用户的直接经济损失。另一方面,由于部署合约的公开透明,任何具备漏洞的代码都很容易被攻击者发现,进而部署合约进行攻击。
[0004]因此,对智能合约进行分析审计有其必要性。EVM字节码是现在使用最广,涉及市值最大的可执行汇编语言。然而EVM字节码具有高复用性的特点,严重阻碍了对部署合约进行自动化静态分析。现有技术中对EVM字节码构建的控制流图并不经过复用分析,因此对复用不敏感,导致构建的控制流图与语义不相符,严重影响后续静态分析的精确性。

技术实现思路

[0005]针对现有技术的不足,本专利技术提出一种基于复用分析的EVM字节码控制流图构建方法,能够为后续静态分析提供有效的控制流图。
[0006]具体技术方案如下:一种基于复用分析的EVM字节码控制流图构建方法,包括以下步骤:S1:将待分析字节码从十六进制形式反汇编成操作码和操作数;S2:根据所述操作码划分基本块;S3:使用递归迭代的策略对所述基本块进行复用分析,并在基本块之间构造控制流,具体通过如下子步骤实现:(3.1)选择一个基本块进行栈模拟,并记录其栈模拟前的初始栈状态快照和栈模拟后的结束栈状态快照;(3.2)标记快照中存在的特征数值;(3.3)根据所述特征数值进行复用分析选择后继基本块,即比较当前基本块在历史迭代记录的快照中是否存在标记的特征数值完全一样的基本块,若有,则将该基本块作为当前基本块的后继基本块;若否,则生成一份复用当前基本块的克隆副本作为后继基本块;(3.4)将所述后继基本块与当前基本块相连,得到一条控制流;(3.5)将所述后继基本块作为新一轮迭代选择的基本块,重复步骤(3.1)

(3.4),直到没有新的控制流产生;
S4:输出S3得到的构建完成的控制流图。
[0007]进一步地,所述S1中反汇编的具体实现方式如下:根据以太坊黄皮书中对EVM操作码的定义,进行逐字节反汇编:采用一个计数器来记录当前反汇编字节相对于智能合约起始0x0的偏移量,该计数器从0x0开始,表示从第一个字节开始进行反汇编;在EVM字节码中,所有的操作指令都是定长的,长度都为一个字节;根据以太坊黄皮书中对EVM操作码的定义,将该字节反汇编成具体的操作码,并将计数器增加1;而当该字节落在0x60到0x7F之间时,表明其对应的操作码为PUSH操作,是将一个具体数值压入栈中,反汇编模块将把后续对应长度的字节标记为数据,不进行反汇编,直接将计数器增加对应字节数。
[0008]进一步地,所述S2的具体实现方式如下:根据控制流相关指令进行基本块划分:采用一个计数器来记录当前指令相对于智能合约起始0x0的偏移量,所述计数器从0x0开始,表示从第一条指令开始进行基本块划分;按照偏移量从小到大,顺序读取所有指令,第一条指令默认为第一个基本块的起始指令,接下来的指令都属于第一个基本块,直到遇到基本块结束指令,每个基本块的偏移量为相对起始指令的偏移量;当指令为跳转指令或交易结束指令时,认为当前指令为当前基本块的结束指令,并将把下一条指令作为下一个基本块的起始指令;当指令为标记跳转目标指令时,认为当前指令为一个新基本块的起始指令,并将当前基本块结束,以上一条指令为当前基本块的结束指令。
[0009]进一步地,所述步骤(3.1)的具体实现方式如下:对所述基本块进行栈的初始化:基本块的初始栈继承了前驱基本块,即前一次迭代的基本块的结束栈状态快照;对于第一次迭代,选择偏移量为0的基本块进行栈模拟,并以一个空栈作为初始栈状态;记录所述基本块的初始栈状态快照;完成后对该基本块进行栈模拟;经过栈模拟,所有指令被转化成具有返回值和操作数的三地址码指令,其中返回值与操作数均为静态单赋值形式符号或具体数值;记录所述基本块的结束栈状态快照;其中,所述栈模拟具体为:根据以太坊黄皮书中对EVM操作码定义的每个操作所需操作数数量和返回值数量,对每句指令进行操作数分配和返回值生成操作;对于PUSH系列指令,根据其语义,将操作码后携带的数据作为操作数与返回值,即不从栈顶取出任何元素,并将数据作为具体数值存入栈顶;所述操作数分配,即为从栈顶取出该指令需要数量的元素,并将以太坊黄皮书中的定义顺序作为操作数;所述返回值生成,即为根据以太坊黄皮书中的定义生成对应数量的静态单赋值形式符号值,作为指令的返回值,存入栈顶。
[0010]进一步地,所述步骤(3.2)的具体实现方式如下:完成栈模拟后,获取所述基本块使用的跳转指令操作数作为特征源;基于此特征源,分别进行顺着程序执行方向和从当前迭代处理基本块回溯到程序开头两个方向的污点分析;将所有与此特征源相关的数值或者符号均放入特征集合后,遍历所有已存储的快照,包括之前迭代轮数中记录的基本块的初始栈状态快照和结束栈状态快照,所有快照中,如
果存在特征集合中的特征,则在此快照中标记该特征。
[0011]进一步地,所述步骤(3.3)的具体实现方式如下:根据所述基本块使用的跳转指令操作数,寻找所有偏移量和此操作数相同的基本块作为候选后继基本块;对于每一个候选后继基本块,通过比较候选后继基本块的初始栈状态快照与当前基本块的结束栈状态快照进行复用分析,即比较两个栈状态快照中所有在当次与此前迭代轮次中,执行步骤(3.2)时被标记的特征,如果存在任一特征不同,则认为该候选后继基本块存在复用行为,舍弃该候选后继基本块;遍历所有候选后继基本块,直到找到一个候选后继基本块,其初始栈状态快照与当前基本块的结束栈状态快照中所有被标记特征都相同,将该候选后继基本块作为当前基本块的后继基本块;若遍历所有候选后继基本块,仍未找到不存在复用行为的后继基本块,则生成一份克隆副本作为当前基本块的后继基本块。
[0012]一种基于复用分析的EVM字节码控制流图构建系统,用于实现所述的基于复用分析的EVM字节码控制流图构建方法,包括:输入模块、反汇编模块、基本块划分模块、控制流构建模块、输出模块;所述输入模块用于接收用户输入的待分析的字节码,并将所述字节码传递给反汇编模块;所述反汇编模块用于对字节码进行反汇编,得到操作码和操作数,并将操作码和操作数传递给基本块划分模块;所述基本块划分模块用于划分基本块,并将基本块传递给控制流构建模块;所述控制流构建模块用于构造控制流;所述输出模块用于输出构建完成的控制流。
[0013]一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于复用分析的EVM字节本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于复用分析的EVM字节码控制流图构建方法,其特征在于,包括以下步骤:S1:将待分析字节码从十六进制形式反汇编成操作码和操作数;S2:根据所述操作码划分基本块;S3:使用递归迭代的策略对所述基本块进行复用分析,并在基本块之间构造控制流,具体通过如下子步骤实现:(3.1)选择一个基本块进行栈模拟,并记录其栈模拟前的初始栈状态快照和栈模拟后的结束栈状态快照;(3.2)标记快照中存在的特征数值;(3.3)根据所述特征数值进行复用分析选择后继基本块,即比较当前基本块在历史迭代记录的快照中是否存在标记的特征数值完全一样的基本块,若有,则将该基本块作为当前基本块的后继基本块;若否,则生成一份复用当前基本块的克隆副本作为后继基本块;(3.4)将所述后继基本块与当前基本块相连,得到一条控制流;(3.5)将所述后继基本块作为新一轮迭代选择的基本块,重复步骤(3.1)

(3.4),直到没有新的控制流产生;S4:输出S3得到的构建完成的控制流图。2.根据权利要求1所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,所述S1中反汇编的具体实现方式如下:根据以太坊黄皮书中对EVM操作码的定义,进行逐字节反汇编:采用一个计数器来记录当前反汇编字节相对于智能合约起始0x0的偏移量,该计数器从0x0开始,表示从第一个字节开始进行反汇编;在EVM字节码中,所有的操作指令都是定长的,长度都为一个字节;根据以太坊黄皮书中对EVM操作码的定义,将该字节反汇编成具体的操作码,并将计数器增加1;而当该字节落在0x60到0x7F之间时,表明其对应的操作码为PUSH操作,是将一个具体数值压入栈中,反汇编模块将把后续对应长度的字节标记为数据,不进行反汇编,直接将计数器增加对应字节数。3.根据权利要求1所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,所述S2的具体实现方式如下:根据控制流相关指令进行基本块划分:采用一个计数器来记录当前指令相对于智能合约起始0x0的偏移量,所述计数器从0x0开始,表示从第一条指令开始进行基本块划分;按照偏移量从小到大,顺序读取所有指令,第一条指令默认为第一个基本块的起始指令,接下来的指令都属于第一个基本块,直到遇到基本块结束指令,每个基本块的偏移量为相对起始指令的偏移量;当指令为跳转指令或交易结束指令时,认为当前指令为当前基本块的结束指令,并将把下一条指令作为下一个基本块的起始指令;当指令为标记跳转目标指令时,认为当前指令为一个新基本块的起始指令,并将当前基本块结束,以上一条指令为当前基本块的结束指令。4.根据权利要求1所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,所述步骤(3.1)的具体实现方式如下:对所述基本块进行栈的初始化:基本块的初始栈继承了前驱基本块,即前一次迭代的基本块的结束栈状态快照;对于第一次迭代,选择偏移量为0的基本块进行栈模拟,并以一个空栈作为初始栈状态;
记录所述基本块的初始栈状态快照;完成后对该基本块进行栈模拟;经过栈模拟,所有指令被转化成具有返回值和操作...

【专利技术属性】
技术研发人员:王丁玎周亚金
申请(专利权)人:浙江大学嘉兴研究院
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1