CN116820405A - 一种基于复用分析的evm字节码控制流图构建方法 - Google Patents
一种基于复用分析的evm字节码控制流图构建方法 Download PDFInfo
- Publication number
- CN116820405A CN116820405A CN202311109896.2A CN202311109896A CN116820405A CN 116820405 A CN116820405 A CN 116820405A CN 202311109896 A CN202311109896 A CN 202311109896A CN 116820405 A CN116820405 A CN 116820405A
- Authority
- CN
- China
- Prior art keywords
- basic block
- control flow
- instruction
- stack
- byte
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 60
- 238000010276 construction Methods 0.000 title claims abstract description 44
- 230000003068 static effect Effects 0.000 claims abstract description 16
- 238000000034 method Methods 0.000 claims abstract description 12
- 238000004088 simulation Methods 0.000 claims description 25
- 238000004590 computer program Methods 0.000 claims description 3
- 239000002243 precursor Substances 0.000 claims description 3
- 238000012545 processing Methods 0.000 claims description 3
- 230000009286 beneficial effect Effects 0.000 abstract description 3
- 230000006399 behavior Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 238000000638 solvent extraction Methods 0.000 description 5
- 238000005206 flow analysis Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012550 audit Methods 0.000 description 1
- 238000010367 cloning Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006870 function Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/10—Requirements analysis; Specification techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/50—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于复用分析的EVM字节码控制流图构建方法,包括:将输入的待分析字节码从十六进制形式反汇编成操作码和操作数;根据所述操作码划分基本块;使用递归迭代的策略,通过分析栈中关键特征数值,判断EVM字节码是否被复用,并构造控制流,重复判断直到没有新的控制流产生;输出构建完成的控制流图。本发明实现方法简便,轻量级开销低,能在短时间内为各种规模的EVM字节码完成复用分析并生成控制流图,生成的对复用敏感的控制流图有助于更精准的静态分析。
Description
技术领域
本发明涉及静态分析和区块链安全领域,尤其涉及一种基于复用分析的EVM字节码控制流图构建方法。
背景技术
随着区块链的高速发展,去中心化金融市场逐渐壮大。相比较传统的中心化金融,去中心化金融具有更透明,更公开的特点。链上的交易行为都通过执行部署的智能合约代码完成,不可被暗中篡改。
智能合约为去中心化金融提供了丰富的功能,并随着高速发展变得更复杂,规模更大,更易存在漏洞。而去中心化金融应用的智能合约中存在的任何潜在漏洞,都会造成用户的直接经济损失。另一方面,由于部署合约的公开透明,任何具备漏洞的代码都很容易被攻击者发现,进而部署合约进行攻击。
因此,对智能合约进行分析审计有其必要性。EVM字节码是现在使用最广,涉及市值最大的可执行汇编语言。然而EVM字节码具有高复用性的特点,严重阻碍了对部署合约进行自动化静态分析。现有技术中对EVM字节码构建的控制流图并不经过复用分析,因此对复用不敏感,导致构建的控制流图与语义不相符,严重影响后续静态分析的精确性。
发明内容
针对现有技术的不足,本发明提出一种基于复用分析的EVM字节码控制流图构建方法,能够为后续静态分析提供有效的控制流图。
具体技术方案如下:
一种基于复用分析的EVM字节码控制流图构建方法,包括以下步骤:
S1:将待分析字节码从十六进制形式反汇编成操作码和操作数;
S2:根据所述操作码划分基本块;
S3:使用递归迭代的策略对所述基本块进行复用分析,并在基本块之间构造控制流,具体通过如下子步骤实现:
(3.1)选择一个基本块进行栈模拟,并记录其栈模拟前的初始栈状态快照和栈模拟后的结束栈状态快照;
(3.2)标记快照中存在的特征数值;
(3.3)根据所述特征数值进行复用分析选择后继基本块,即比较当前基本块在历史迭代记录的快照中是否存在标记的特征数值完全一样的基本块,若有,则将该基本块作为当前基本块的后继基本块;若否,则生成一份复用当前基本块的克隆副本作为后继基本块;
(3.4)将所述后继基本块与当前基本块相连,得到一条控制流;
(3.5)将所述后继基本块作为新一轮迭代选择的基本块,重复步骤(3.1)-(3.4),直到没有新的控制流产生;
S4:输出S3得到的构建完成的控制流图。
进一步地,所述S1中反汇编的具体实现方式如下:
根据以太坊黄皮书中对EVM操作码的定义,进行逐字节反汇编:采用一个计数器来记录当前反汇编字节相对于智能合约起始0x0的偏移量,该计数器从0x0开始,表示从第一个字节开始进行反汇编;在EVM字节码中,所有的操作指令都是定长的,长度都为一个字节;根据以太坊黄皮书中对EVM操作码的定义,将该字节反汇编成具体的操作码,并将计数器增加1;而当该字节落在0x60到0x7F之间时,表明其对应的操作码为PUSH操作,是将一个具体数值压入栈中,反汇编模块将把后续对应长度的字节标记为数据,不进行反汇编,直接将计数器增加对应字节数。
进一步地,所述S2的具体实现方式如下:
根据控制流相关指令进行基本块划分:
采用一个计数器来记录当前指令相对于智能合约起始0x0的偏移量,所述计数器从0x0开始,表示从第一条指令开始进行基本块划分;按照偏移量从小到大,顺序读取所有指令,第一条指令默认为第一个基本块的起始指令,接下来的指令都属于第一个基本块,直到遇到基本块结束指令,每个基本块的偏移量为相对起始指令的偏移量;当指令为跳转指令或交易结束指令时,认为当前指令为当前基本块的结束指令,并将把下一条指令作为下一个基本块的起始指令;当指令为标记跳转目标指令时,认为当前指令为一个新基本块的起始指令,并将当前基本块结束,以上一条指令为当前基本块的结束指令。
进一步地,所述步骤(3.1)的具体实现方式如下:
对所述基本块进行栈的初始化:基本块的初始栈继承了前驱基本块,即前一次迭代的基本块的结束栈状态快照;对于第一次迭代,选择偏移量为0的基本块进行栈模拟,并以一个空栈作为初始栈状态;
记录所述基本块的初始栈状态快照;完成后对该基本块进行栈模拟;经过栈模拟,所有指令被转化成具有返回值和操作数的三地址码指令,其中返回值与操作数均为静态单赋值形式符号或具体数值;记录所述基本块的结束栈状态快照;
其中,所述栈模拟具体为:
根据以太坊黄皮书中对EVM操作码定义的每个操作所需操作数数量和返回值数量,对每句指令进行操作数分配和返回值生成操作;对于PUSH系列指令,根据其语义,将操作码后携带的数据作为操作数与返回值,即不从栈顶取出任何元素,并将数据作为具体数值存入栈顶;
所述操作数分配,即为从栈顶取出该指令需要数量的元素,并将以太坊黄皮书中的定义顺序作为操作数;
所述返回值生成,即为根据以太坊黄皮书中的定义生成对应数量的静态单赋值形式符号值,作为指令的返回值,存入栈顶。
进一步地,所述步骤(3.2)的具体实现方式如下:
完成栈模拟后,获取所述基本块使用的跳转指令操作数作为特征源;基于此特征源,分别进行顺着程序执行方向和从当前迭代处理基本块回溯到程序开头两个方向的污点分析;将所有与此特征源相关的数值或者符号均放入特征集合后,遍历所有已存储的快照,包括之前迭代轮数中记录的基本块的初始栈状态快照和结束栈状态快照,所有快照中,如果存在特征集合中的特征,则在此快照中标记该特征。
进一步地,所述步骤(3.3)的具体实现方式如下:
根据所述基本块使用的跳转指令操作数,寻找所有偏移量和此操作数相同的基本块作为候选后继基本块;对于每一个候选后继基本块,通过比较候选后继基本块的初始栈状态快照与当前基本块的结束栈状态快照进行复用分析,即比较两个栈状态快照中所有在当次与此前迭代轮次中,执行步骤(3.2)时被标记的特征,如果存在任一特征不同,则认为该候选后继基本块存在复用行为,舍弃该候选后继基本块;遍历所有候选后继基本块,直到找到一个候选后继基本块,其初始栈状态快照与当前基本块的结束栈状态快照中所有被标记特征都相同,将该候选后继基本块作为当前基本块的后继基本块;
若遍历所有候选后继基本块,仍未找到不存在复用行为的后继基本块,则生成一份克隆副本作为当前基本块的后继基本块。
一种基于复用分析的EVM字节码控制流图构建系统,用于实现所述的基于复用分析的EVM字节码控制流图构建方法,包括:输入模块、反汇编模块、基本块划分模块、控制流构建模块、输出模块;
所述输入模块用于接收用户输入的待分析的字节码,并将所述字节码传递给反汇编模块;
所述反汇编模块用于对字节码进行反汇编,得到操作码和操作数,并将操作码和操作数传递给基本块划分模块;
所述基本块划分模块用于划分基本块,并将基本块传递给控制流构建模块;
所述控制流构建模块用于构造控制流;
所述输出模块用于输出构建完成的控制流。
一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现所述的基于复用分析的EVM字节码控制流图构建方法。
本发明的有益效果是:
(1)本发明提出了基于复用分析的EVM字节码控制流图构建方法,实现了对EVM字节码的复用分析,使构建的控制流图与语义相符。
(2)本发明基于复用分析,通过生成复用基本块的克隆副本,本发明在低开销的情况下能够为各种规模的EVM字节码构造精准的控制流图,为进一步进行静态分析提供有效的原语。
附图说明
图1是本发明基于复用分析的EVM字节码控制流图构建系统的架构图。
图2是本发明基于复用分析的EVM字节码控制流图构建方法的流程图。
图3是未经复用分析生成本发明实施例中的示例代码片段的控制流图。
图4是基于含复用行为的控制流图所进行的数据流分析。
图5是基于复用分析生成本发明实施例中的示例代码片段的控制流图。
图6是基于不含有复用行为的控制流图所进行的数据流分析。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一个具体实施例”,其描述了所有可能实施例的子集,但是可以理解,“一个具体实施例”,其描述了所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
除非另有定义,本文所使用的所有的技术的科学技术与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本发明实施例的目的,不是旨在限制本发明。
如图1所示,一种基于复用分析的EVM字节码控制流图构建系统,包括:输入模块、反汇编模块、基本块划分模块、控制流构建模块、输出模块。
输入模块用于接收用户输入的待分析智能合约字节码,并将这些字节码传递给反汇编模块。
反汇编模块用于对字节码进行反汇编,得到操作码和操作数,并将操作码和操作数传递给基本块划分模块。
基本块划分模块用于根据操作码划分得到基本块,并将基本块传递给控制流构建模块。
控制流构建模块用于使用递归迭代的策略对基本块进行复用分析,并在基本块之间构造控制流。
输出模块用于输出构建完成的控制流。
如图2所示,一种基于复用分析的EVM字节码控制流图构建方法,包括以下步骤:
S1:将用户输入的待分析字节码从十六进制形式反汇编成操作码和操作数。具体通过如下子步骤实现:
(1.1)用户向系统的输入模块中输入待分析字节码,输入模块将字节码传递给反汇编模块。
(1.2)反汇编模块将字节码从十六进制形式反汇编成操作码和操作数。
作为一个具体实施例,可以根据以太坊黄皮书中对EVM操作码的定义,进行逐字节反汇编。具体来说,反汇编模块内部维护了一个计数器来记录当前反汇编字节相对于智能合约起始(0x0)的偏移量。该计数器从0x0开始,表示从第一个字节开始进行反汇编。在EVM字节码中,所有的操作指令都是定长的,长度都为一个字节。反汇编模块根据以太坊黄皮书中对EVM操作码的定义,将该字节反汇编成具体的操作码,并将计数器增加1;而当该字节落在0x60到0x7F之间时,表明其对应的操作码为PUSH操作,是将一个具体数值压入栈中,反汇编模块将把后续对应长度的字节标记为数据,不进行反汇编,直接将计数器增加对应字节数。比如,如果在偏移量为0x0时,反汇编模块遇到字节码0x60、0x61,反汇编模块会先将第一个0x60翻译为PUSH1,并将计数器增加到0x1,该操作码表示后一个字节为数值,将被压入栈顶,因此反汇编模块将把后面紧接的0x61标记为数据,而不是翻译为PUSH2,并将计数器直接增到0x2;作为结果,0x60、0x61将被反汇编成PUSH1、0x61。这样做的好处是,当数据中包含0x5B(对应指令JUMPDEST)这种影响基本块划分的数值时,不会因为对数据进行无意义的反汇编,从而导致划分出额外的基本块,影响语义。
S2:根据操作码划分基本块。基本块是由一句或多句指令组成的可以顺序执行的指令序列,一个基本块的指令序列中不存在控制流结构,即不存在跳转指令。
作为其中一种实施方式,可以根据控制流相关指令,如JUMP、JUMPI、REVERT等和标志基本块开始的指令JUMPDEST进行基本块划分。需要注意的是,操作码和指令在一些情况下可以替换,本专利中的指令包含操作码与操作数,而EVM字节码中有一些操作并不需要操作数,因此对于这些操作,操作码就是指令。
具体来说,基本块划分模块内部维护了一个计数器来记录当前指令相对于智能合约起始(0x0)的偏移量。该计数器从0x0开始,表示从第一条指令开始进行基本块划分;基本块划分模块按照偏移量从小到大,顺序读取所有指令,第一条指令默认为第一个基本块的起始指令,接下来的指令都属于第一个基本块,直到遇到基本块结束指令,每个基本块的偏移量为其起始指令(所包含的所有指令中的第一条指令)的偏移量。当指令为跳转指令(如JUMP、JUMPI等)或交易结束指令(如RETURN、STOP、REVERT等)时,基本块划分模块认为当前指令为当前基本块的结束指令,并将把下一条指令作为下一个基本块的起始指令。当指令为标记跳转目标指令(如JUMPDEST)时,基本块划分模块认为当前指令为一个新基本块的起始指令,并将当前基本块结束,以上一条指令为当前基本块的结束指令。
S3:使用递归迭代的策略对基本块进行复用分析,并在基本块之间构造控制流。具体通过如下子步骤实现:
(3.1)选择一个基本块进行栈模拟并记录栈模拟前后的快照,具体实现方式如下:
控制流构建模块首先对该基本块进行栈的初始化,具体来说,基本块的初始栈继承了前驱基本块(即前一次迭代的基本块)的结束栈状态快照。第一次迭代时选择偏移量为0的基本块进行栈模拟,并以一个空栈作为初始栈状态。
栈初始化结束后、栈模拟开始前,控制流构建模块对该基本块记录一次基本块的初始栈状态快照。
完成基本块的初始栈状态快照记录后,控制流构建模块对该基本块进行栈模拟。栈模拟结束后,控制流构建模块对该基本块记录一次基本块的结束栈状态快照。
其中,栈模拟具体为:根据以太坊黄皮书中对EVM操作码定义的每个操作所需操作数数量和返回值数量,控制流构建模块对每句指令进行操作数分配和返回值生成操作。对于PUSH系列指令(从PUSH1到PUSH32,操作码为0x60到0x7F),根据其语义,控制流构建模块将操作码后携带的数据作为操作数与返回值,即不从栈顶取出任何元素,并将数据作为具体数值存入栈顶。经过栈模拟,所有指令被转化成具有返回值和操作数的三地址码指令,其中返回值与操作数均为静态单赋值形式(Static Single Assignment form,以下简称SSA)符号或具体数值。
其中,操作数分配,即从栈顶取出该指令需要数量的元素,将以太坊黄皮书中的定义顺序作为操作数。返回值生成,即根据以太坊黄皮书中的定义生成对应数量的SSA符号值,作为指令的返回值,存入栈顶。
控制流构建模块对每个基本块都维护了初始与结束两个栈状态快照,均用于后续步骤,即步骤(3.3)、(3.4)中进行复用分析与控制流构建。
(3.2)标记快照中存在的特征数值:栈模拟完成后,控制流构建模块获取该基本块使用的跳转指令操作数,以此作为特征源。基于此特征源,控制流构建模块分别进行朝前(顺着程序执行方向)和朝后(从当前迭代处理基本块回溯到程序开头)两个方向的污点分析。将所有与此特征源相关的数值或者符号均放入特征集合,收集完所有可能特征后,控制流构建模块遍历所有已存储的快照,包括之前迭代轮数中记录的基本块的初始栈状态快照和结束栈状态快照,所有快照中,如果存在特征集合中的特征,则在此快照中标记该特征。快照中所有被标记了的元素将成为后续步骤,即步骤(3.3)中复用分析的比较对象。
(3.3)根据快照中标记的特征数值进行复用分析选择后继基本块,即比较当前基本块在之前迭代的栈模拟记录的快照中是否存在标记的特征数值完全一样的基本块,若有,则将该基本块作为当前基本块的后继基本块;若否,则说明控制流存在复用情况,生成一份复用当前基本块的克隆副本作为当前基本块的后继基本块。具体操作如下:
控制流构建模块根据该基本块使用的跳转指令操作数,寻找所有偏移量和此操作数相同的基本块作为候选后继基本块,由于在之前的迭代中可能已经存在过克隆行为,因此候选后继基本块通常不止一个。对于每一个候选后继基本块,控制流构建模块通过比较候选后继基本块的初始栈状态快照与当前基本块的结束栈状态快照进行复用分析,即比较两个栈状态快照中所有在当次与此前迭代轮次中,执行步骤(3.2)时被标记的特征,如果存在任一特征不同,则表明该候选后继基本块不能作为当前基本块的后继,因为若该候选后继基本块作为当前基本块的后继,此控制流与之前迭代中生成的控制流之间存在复用关系。直到找到一个候选后继基本块,其初始栈状态快照与当前基本块的结束栈状态快照中所有被标记特征都相同,将该候选后继基本块作为当前基本块的后继基本块。
如果遍历完所有候选后继基本块后,控制流构建模块都没有找到不存在复用行为的后继基本块,则生成一份克隆副本作为当前基本块的后继基本块,该副本拥有和所有候选后继基本块一样的偏移量和指令,但不存在栈快照。
(3.4)构建基本块之间的控制流。控制流构建模块将步骤(3.3)中选定的后继基本块与当前基本块相连,得到一条控制流。
(3.5)将所述后继基本块作为新一轮迭代选择的基本块,重复步骤(3.1)-(3.4),直到再也没有新的控制流产生,此时说明控制流图的构造已经完成。
S4:输出模块向用户输出S3得到的、构建完成的控制流图。
本发明能输出对复用敏感、语义更为精准的控制流图。下面通过一个实施例具体说明复用与复用分析带来的影响。提供一段示例代码具体如下:
if x<1:
x += 2
if x<2:
x *= 2
x += 2
示例代码包括两个if-else判断,其中第二行和第五行都进行了操作x += 2,Solidity编译器为了缩小生成的字节码长度,会将这两句话用同样一段字节码进行实现。为了方便理解,此处仍然使用源代码进行示意。现存工具基于原始字节码直接生成的控制流图如图3所示,语义从两个if-else判断,变成了一个死循环,与原始语义有了很大的背离;而基于此种控制流图所进行的数据流分析如图4所示,造成了大量的数据流假阳性,比如,x1原本只应依赖x0,而分析出x0依赖于所有变量。不进行复用分析,包含复用行为的控制流图会因此造成静态分析效率和准确性大打折扣,因此,对于EVM字节码这种存在大量复用行为的汇编语言,需要进行单独的复用分析来构建精准的控制流图。使用本发明方法经过复用分析后生成的控制流图如图5所示,基于此做的数据流分析如图6所示,由图可知,本发明生成的控制流图符合源代码语义。
综上所述,本发明提出了一种基于复用分析的EVM字节码控制流图构建方法,该方法通过分析栈中关键特征数值,判断EVM字节码是否被复用,从而还原出符合真实语义的控制流图。本发明的分析面向完全公开、任何人皆可获取的区块链部署合约字节码,实现方法简便,轻量级开销低,能在短时间内为各种规模的EVM字节码完成复用分析并生成控制流图,生成的对复用敏感的控制流图有助于更精准的静态分析。
本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。
Claims (8)
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的基本块进行栈模拟,并以一个空栈作为初始栈状态;
记录所述基本块的初始栈状态快照;完成后对该基本块进行栈模拟;经过栈模拟,所有指令被转化成具有返回值和操作数的三地址码指令,其中返回值与操作数均为静态单赋值形式符号或具体数值;记录所述基本块的结束栈状态快照;
其中,所述栈模拟具体为:
根据以太坊黄皮书中对EVM操作码定义的每个操作所需操作数数量和返回值数量,对每句指令进行操作数分配和返回值生成操作;对于PUSH系列指令,根据其语义,将操作码后携带的数据作为操作数与返回值,即不从栈顶取出任何元素,并将数据作为具体数值存入栈顶;
所述操作数分配,即为从栈顶取出该指令需要数量的元素,并将以太坊黄皮书中的定义顺序作为操作数;
所述返回值生成,即为根据以太坊黄皮书中的定义生成对应数量的静态单赋值形式符号值,作为指令的返回值,存入栈顶。
5.根据权利要求1所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,所述步骤(3.2)的具体实现方式如下:
完成栈模拟后,获取所述基本块使用的跳转指令操作数作为特征源;基于此特征源,分别进行顺着程序执行方向和从当前迭代处理基本块回溯到程序开头两个方向的污点分析;将所有与此特征源相关的数值或者符号均放入特征集合后,遍历所有已存储的快照,包括之前迭代轮数中记录的基本块的初始栈状态快照和结束栈状态快照,所有快照中,如果存在特征集合中的特征,则在此快照中标记该特征。
6.根据权利要求1所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,所述步骤(3.3)的具体实现方式如下:
根据所述基本块使用的跳转指令操作数,寻找所有偏移量和此操作数相同的基本块作为候选后继基本块;对于每一个候选后继基本块,通过比较候选后继基本块的初始栈状态快照与当前基本块的结束栈状态快照进行复用分析,即比较两个栈状态快照中所有在当次与此前迭代轮次中,执行步骤(3.2)时被标记的特征,如果存在任一特征不同,则认为该候选后继基本块存在复用行为,舍弃该候选后继基本块;遍历所有候选后继基本块,直到找到一个候选后继基本块,其初始栈状态快照与当前基本块的结束栈状态快照中所有被标记特征都相同,将该候选后继基本块作为当前基本块的后继基本块;
若遍历所有候选后继基本块,仍未找到不存在复用行为的后继基本块,则生成一份克隆副本作为当前基本块的后继基本块。
7.一种基于复用分析的EVM字节码控制流图构建系统,用于实现权利要求1-6任意一项所述的基于复用分析的EVM字节码控制流图构建方法,其特征在于,包括:输入模块、反汇编模块、基本块划分模块、控制流构建模块、输出模块;
所述输入模块用于接收用户输入的待分析的字节码,并将所述字节码传递给反汇编模块;
所述反汇编模块用于对字节码进行反汇编,得到操作码和操作数,并将操作码和操作数传递给基本块划分模块;
所述基本块划分模块用于划分基本块,并将基本块传递给控制流构建模块;
所述控制流构建模块用于构造控制流;
所述输出模块用于输出构建完成的控制流。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-6任意一项所述的基于复用分析的EVM字节码控制流图构建方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311109896.2A CN116820405B (zh) | 2023-08-31 | 2023-08-31 | 一种基于复用分析的evm字节码控制流图构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311109896.2A CN116820405B (zh) | 2023-08-31 | 2023-08-31 | 一种基于复用分析的evm字节码控制流图构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116820405A true CN116820405A (zh) | 2023-09-29 |
CN116820405B CN116820405B (zh) | 2023-12-01 |
Family
ID=88122512
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311109896.2A Active CN116820405B (zh) | 2023-08-31 | 2023-08-31 | 一种基于复用分析的evm字节码控制流图构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116820405B (zh) |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6643260B1 (en) * | 1998-12-18 | 2003-11-04 | Cisco Technology, Inc. | Method and apparatus for implementing a quality of service policy in a data communications network |
CN104794401A (zh) * | 2015-04-15 | 2015-07-22 | 南京大学 | 一种静态分析辅助的符号执行漏洞检测方法 |
CN111523784A (zh) * | 2020-04-16 | 2020-08-11 | 广州拉卡拉信息技术有限公司 | 自动执行路径的监控方法及装置 |
CN112100054A (zh) * | 2020-08-12 | 2020-12-18 | 北京大学 | 一种面向数据管控的程序静态分析方法和系统 |
CN112631611A (zh) * | 2021-01-06 | 2021-04-09 | 中山大学 | 一种智能庞氏骗局合约识别方法及装置 |
CN112651028A (zh) * | 2021-01-05 | 2021-04-13 | 西安工业大学 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
CN112749389A (zh) * | 2020-12-29 | 2021-05-04 | 华南师范大学 | 一种检测智能合约破坏敏感数据漏洞的检测方法及装置 |
CN112990941A (zh) * | 2021-03-10 | 2021-06-18 | 武汉大学 | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 |
CN114385185A (zh) * | 2021-12-24 | 2022-04-22 | 深圳前海微众银行股份有限公司 | 一种智能合约的控制流图生成方法及装置 |
CN116361806A (zh) * | 2023-02-27 | 2023-06-30 | 中国科学院信息工程研究所 | 基于多示例和注意力机制的智能合约分析方法及装置 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
CN116522342A (zh) * | 2023-05-10 | 2023-08-01 | 东南大学 | 基于字节码重写的智能合约漏洞自动化修复系统及方法 |
-
2023
- 2023-08-31 CN CN202311109896.2A patent/CN116820405B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6643260B1 (en) * | 1998-12-18 | 2003-11-04 | Cisco Technology, Inc. | Method and apparatus for implementing a quality of service policy in a data communications network |
CN104794401A (zh) * | 2015-04-15 | 2015-07-22 | 南京大学 | 一种静态分析辅助的符号执行漏洞检测方法 |
CN111523784A (zh) * | 2020-04-16 | 2020-08-11 | 广州拉卡拉信息技术有限公司 | 自动执行路径的监控方法及装置 |
CN112100054A (zh) * | 2020-08-12 | 2020-12-18 | 北京大学 | 一种面向数据管控的程序静态分析方法和系统 |
CN112749389A (zh) * | 2020-12-29 | 2021-05-04 | 华南师范大学 | 一种检测智能合约破坏敏感数据漏洞的检测方法及装置 |
CN112651028A (zh) * | 2021-01-05 | 2021-04-13 | 西安工业大学 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
CN112631611A (zh) * | 2021-01-06 | 2021-04-09 | 中山大学 | 一种智能庞氏骗局合约识别方法及装置 |
CN112990941A (zh) * | 2021-03-10 | 2021-06-18 | 武汉大学 | 一种针对智能合约中庞氏骗局的漏洞检测方法及系统 |
CN114385185A (zh) * | 2021-12-24 | 2022-04-22 | 深圳前海微众银行股份有限公司 | 一种智能合约的控制流图生成方法及装置 |
CN116361806A (zh) * | 2023-02-27 | 2023-06-30 | 中国科学院信息工程研究所 | 基于多示例和注意力机制的智能合约分析方法及装置 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
CN116522342A (zh) * | 2023-05-10 | 2023-08-01 | 东南大学 | 基于字节码重写的智能合约漏洞自动化修复系统及方法 |
Non-Patent Citations (3)
Title |
---|
HAI ZHANG 等: "Flow Byte Sizes Estimation from Simple Random packet Sampling", 《2009 FIFTH INTERNATIONAL JOINT CONFERENCE ON INC, IMS AND IDC》, pages 92 - 96 * |
林丹 等: "基于字节码的以太坊智能合约分类方法", 《网络与信息安全学报》, vol. 8, no. 5, pages 111 - 120 * |
贺海武 等: "基于区块链的智能合约技术与应用综述", 《计算机研究与发展》, vol. 55, no. 11, pages 2452 - 2466 * |
Also Published As
Publication number | Publication date |
---|---|
CN116820405B (zh) | 2023-12-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11036614B1 (en) | Data control-oriented smart contract static analysis method and system | |
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
US7571427B2 (en) | Methods for comparing versions of a program | |
Allen et al. | Automatic translation of Fortran programs to vector form | |
CN110287702B (zh) | 一种二进制漏洞克隆检测方法及装置 | |
Meng et al. | Identifying multiple authors in a binary program | |
CN104636256A (zh) | 一种内存访问异常的检测方法及装置 | |
US10354069B2 (en) | Automated reverse engineering | |
US11262988B2 (en) | Method and system for using subroutine graphs for formal language processing | |
Alrabaee et al. | On leveraging coding habits for effective binary authorship attribution | |
CN115373737B (zh) | 一种基于特征融合的代码克隆检测方法 | |
Zhao et al. | Haepg: An automatic multi-hop exploitation generation framework | |
CN115022026A (zh) | 一种区块链智能合约威胁检测装置及方法 | |
CN113536308B (zh) | 软件基因视角下多粒度信息融合的二进制代码溯源方法 | |
Escalada et al. | An efficient platform for the automatic extraction of patterns in native code | |
CN116820405B (zh) | 一种基于复用分析的evm字节码控制流图构建方法 | |
Balbaert et al. | Julia: High performance programming | |
Alrabaee et al. | Compiler provenance attribution | |
Scherer et al. | I/o interaction analysis of binary code | |
Sun et al. | Dynamic branch resolution based on combined static analyses | |
Sunitha | Compiler construction | |
CN118171290B (zh) | 基于源代码和字节码的智能合约漏洞检测方法和系统 | |
Balcı et al. | Accelerating Smart Contract Vulnerability Scan Using Transformers | |
Wright | Using EventB to create a virtual machine instruction set architecture | |
CN113296833B (zh) | 一种二进制文件中合法指令的识别方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |