欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

区块链安全——以太坊智能合约静态分析

来源:本站整理 作者:佚名 时间:2019-01-10 TAG: 我要投稿
      revert
   
    auxdata: 0xa165627a7a72305820f633e21e144cae24615a160fcb484c1f9495df86d7d21e9be0df2cf3b4c1f9eb0029
}
由1.2.2小节可知,智能合约编译后的字节码分为部署代码、runtime代码和auxdata三部分。同样,智能合约编译生成的汇编指令也分为三部分:EVM assembly标签下的汇编指令对应的是部署代码;sub_0标签下的汇编指令对应的是runtime代码;sub_0标签下的auxdata和字节码中的auxdata完全相同。由于目前智能合约文件并没有实质的内容,所以sub_0标签下没有任何有意义的汇编指令。
1.2.4 生成ABI
solc命令的–abi选项可以用来生成智能合约的ABI,同样还是最开始的智能合约代码进行演示。
执行solc命令:
solc  --abi test.sol
输出结果如下:
======= test.sol:Test =======
Contract JSON ABI
[]
可以看到生成的结果中ABI数组为空,因为我们的智能合约里并没有内容(没有变量声明,没有函数)。
1.3 总结
本章节主要介绍了编译环境的搭建、智能合约的字节码的结构组成以及solc命令的常见用法(生成字节码,生成汇编代码,生成abi)。在下一章中,我们将对生成的汇编代码做深入的分析。
 
第二章 智能合约汇编指令分析
本章是智能合约静态分析的第二章,在第一章中我们简单演示了如何通过solc命令生成智能合约的汇编代码,在本章中我们将对智能合约编译后的汇编代码进行深入分析,以及通过evm命令对编译生成的字节码进行反编译。
2.1 以太坊中的汇编指令
为了让大家更好的理解汇编指令,我们先简单介绍下以太坊虚拟机EVM的存储结构,熟悉Java虚拟机的同学可以把EVM和JVM进行对比学习。
2.1.1 以太坊虚拟机EVM
编程语言虚拟机一般有两种类型,基于栈,或者基于寄存器。和JVM一样,EVM也是基于栈的虚拟机。
既然是支持栈的虚拟机,那么EVM肯定首先得有个栈。为了方便进行密码学计算,EVM采用了32字节(256比特)的字长。EVM栈以字(Word)为单位进行操作,最多可以容纳1024个字。下面是EVM栈的示意图:

EVM栈示意图
2.1.2 以太坊的汇编指令集:
和JVM一样,EVM执行的也是字节码。由于操作码被限制在一个字节以内,所以EVM指令集最多只能容纳256条指令。目前EVM已经定义了约142条指令,还有100多条指令可供以后扩展。这142条指令包括算术运算指令,比较操作指令,按位运算指令,密码学计算指令,栈、memory、storage操作指令,跳转指令,区块、智能合约相关指令等。下面是已经定义的EVM操作码分布图[1](灰色区域是目前还没有定义的操作码)

下面的表格中总结了常用的汇编指令:
操作码
汇编指令
描述
0x00
STOP
结束指令
0x01
ADD
把栈顶的两个值出栈,相加后把结果压入栈顶
0x02
MUL
把栈顶的两个值出栈,相乘后把结果压入栈顶
0x03
SUB
从栈中依次出栈两个值arg0和arg1,用arg0减去arg1,再把结果压入栈顶
0x10
LT
把栈顶的两个值出栈,如果先出栈的值小于后出栈的值则把1入栈,反之把0入栈
0x11
GT
和LT类似,如果先出栈的值大于后出栈的值则把1入栈,反之把0入栈
0x14
EQ
把栈顶的两个值出栈,如果两个值相等则把1入栈,否则把0入栈
0x15
ISZERO
把栈顶值出栈,如果该值是0则把1入栈,否则把0入栈
0x34
CALLVALUE
获取交易中的转账金额
0x35
CALLDATALOAD
获取交易中的input字段的值
0x36
CALLDATASIZE
获取交易中input字段的值的长度
0x50
POP
把栈顶值出栈
0x51
MLOAD
把栈顶出栈并以该值作为内存中的索引,加载内存中该索引之后的32字节到栈顶
0x52
MSTORE
从栈中依次出栈两个值arg0和arg1,并把arg1存放在内存的arg0处
0x54
SLOAD
把栈顶出栈并以该值作为storage中的索引,加载该索引对应的值到栈顶
0x55
SSTORE
从栈中依次出栈两个值arg0和arg1,并把arg1存放在storage的arg0处
0x56
JUMP
把栈顶值出栈,并以此值作为跳转的目的地址
0x57
JUMPI
从栈中依次出栈两个值arg0和arg1,如果arg1的值为真则跳转到arg0处,否则不跳转
0x60
PUSH1
把1个字节的数值放入栈顶
0x61
PUSH2
把2个字节的数值放入栈顶
0x80
DUP1
复制当前栈中第一个值到栈顶
0x81
DUP2
复制当前栈中第二个值到栈顶
0x90
SWAP1
把栈中第一个值和第二个值进行调换
0x91
SWAP2
把栈中第一个值和第三个值进行调换
2.2 智能合约汇编分析
在第一章中,为了便于入门,我们分析的智能合约文件并不包含实质的内容。在本章中我们以一个稍微复杂的智能合约为例进行分析。智能合约(保存在test.sol文件中)代码如下:
pragma solidity ^0.4.25;
contract Overflow {
    uint private sellerBalance=0;
    function add(uint value) returns (bool, uint){
        sellerBalance += value;
        assert(sellerBalance >= value);
    }
}
2.2.1 生成汇编代码
执行solc命令:solc –asm –optimize test.sol,其中–optimize选项用来开启编译优化
输出的结果如下:
EVM assembly:
... */ "test.sol":26:218  contract Overflow {
  mstore(0x40, 0x80)
    /* "test.sol":78:79  0 */

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载