《智能合约安全入门》从环境介绍,Solidity、web3基础和漏洞原理及利用方面,详细地介绍智能合约相关漏洞知识。其中,第一部分介绍了 Remix IDE、Metamask 以及geth等环境的安装和使用方法;第二部分介绍了solidity语言的基础知识与基本语法,以及web3的使用方法;第三部分重点讲解了智能合约常见漏洞的基本原理及其攻击方式,同时还增加了 Ethernaut 通关游戏的部分内容,以此来加深对漏洞原理的理解。
天融信科技集团(证券代码:002212)创始于1995年,是国内首家网络安全企业,亲历中国网络安全产业的发展历程,如今已从中国第一台自主研发防火墙的缔造者成长为中国领先的网络安全、大数据与云服务提供商。天融信始终以捍卫国家网络空间安全为己任,创新超越,致力于成为民族安全产业的领导者、领先安全技术的创造者和数字时代安全的赋能者。
目 录
第0章 初探区块链与智能合约 1
关于区块链 1
区块链定义 1
区块链技术 1
区块链层级结构 2
区块链的优点 2
关于智能合约 2
以太坊 3
第1章 环境准备 5
1.1 使用npm安装Remix IDE 5
1.2 使用docker安装Remix IDE 6
1.3 使用docker安装geth 7
1.4 本章总结 8
第2章 Remix环境介绍和使用方法 9
2.1 Remix环境的使用方法1 9
部署学习 11
2.2 Remix环境的使用方法2 12
2.2.1 部署学习 13
2.2.2 构造函数 14
2.2.3 初始化合约余额 14
2.3 Remix环境的使用方法3 15
Remix搭配MetaMask 15
2.4 本章总结 17
第3章 MetaMask的使用方法 18
3.1 安装MetaMask 18
3.2 获取测试币 20
3.3 MetaMask Api的使用方法 21
3.4 本章总结 22
第4章 geth的使用方法 23
4.1 geth基础命令 23
子命令的使用方法 24
4.2 console的基础命令 25
4.2.1 console中web3对象的命令 25
4.2.2 console中的挖矿 26
4.3 geth启动节点 26
4.3.1 启动节点 26
4.3.2 测试节点 27
4.3.3 启动参数说明 27
4.3.4 关于RPC 27
4.3.5 连接节点 28
4.3.6 新建用户 28
4.3.7 开始挖矿 28
4.3.8 测试转账 29
4.4 部署智能合约1 30
4.4.1 使用容器提供例子 30
4.4.2 重新编译 31
4.5 调用智能合约1 34
4.6 geth从头搭建私链 36
4.6.1 创建目录 36
4.6.2 启动私链节点 38
4.7 部署智能合约2 39
4.8 调用智能合约2 40
4.9 geth的新版本 40
4.10 本章总结 41
第5章 Solidity语言基础 42
5.1 创建合约 42
5.2 合约接口 43
5.3 变量类型 44
5.4 变量修饰 44
5.5 类型转换 45
5.6 数学运算 45
5.7 字符串比较 46
5.8 结构体 46
5.9 普通数组 46
5.10 函数定义及修饰 47
5.11 构造函数 47
5.12 函数返回值 48
5.13 自毁函数 48
5.14 fallback函数 49
5.15 receive函数 50
5.16 msg全局变量和tx全局变量 50
5.16.1 msg全局变量 50
5.16.2 tx全局变量 51
5.17 创建事件 52
5.18 循环结构 53
5.19 以太币单位 53
5.20 转账函数 54
5.21 本章总结 55
第6章 Solidity数据存储 56
6.1 存储中的状态变量存储结构 56
6.2 紧凑存储 57
6.3 动态大小数据存储 58
6.3.1 动态String 58
6.3.2 关于length*2问题 60
6.4 动态数组存储 60
6.5 字典mapping存储 61
6.6 本章总结 62
第7章 web3.js和web3.py 63
7.1 web3.js 63
7.2 web3.js配合MetaMask使用 64
7.2.1 异步请求方式1 65
7.2.2 异步请求方式2 65
7.2.3 异步请求方式3 66
7.3 常用函数 67
7.3.1 hash函数 67
7.3.2 与地址相关 68
7.3.3 单位转换 68
7.3.4 字符串转换 68
7.3.5 账户和余额 69
7.3.6 获取插槽数据 69
7.3.7 获取区块信息 69
7.3.8 获取交易信息 70
7.3.9 交易签名和发送 71
7.3.10 ABI签名和编码 73
7.4 web3.js连接节点 74
7.5 web3.js部署合约 75
7.6 web3.js合约交互 77
7.6.1 实例化合约对象 77
7.6.2 web3.js call调用 77
7.6.3 web3.js send调用 78
7.7 web3.py 78
7.8 web3.py部署合约 79
7.9 web3.py合约交互 79
7.10 本章总结 80
第8章 利用漏洞 81
8.1 关于call函数 81
8.1.1 函数选择器(函数签名) 81
8.1.2 call函数无参数调用 83
8.1.3 call函数有参数调用 85
8.1.4 call函数调用其他合约 87
8.2 漏洞场景 88
8.3 代码分析 89
8.4 漏洞复现 89
8.5 本章总结 91
第9章 重入漏洞 92
9.1 关于重入漏洞 92
9.2 关于fallback函数 92
9.3 攻击场景 92
9.4 漏洞场景 93
9.5 攻击演示 95
9.6 本章总结 98
第10章 整型溢出漏洞 99
10.1 溢出原理 99
10.2 溢出场景 100
10.2.1 加法溢出 100
10.2.2 减法溢出 101
10.3 案例分析 102
10.3.1 BEC合约代码片段 102
10.3.2 代码分析 102
10.4 攻击模拟 103
10.5 本章总结 105
第11章 访问控制漏洞 106
11.1 关于访问控制漏洞 106
11.1.1 代码层面的可见性 106
11.1.2 逻辑层面的权限约束 106
11.2 漏洞场景1 106
11.2.1 漏洞场景分析 107
11.2.2 漏洞场景演示 107
11.2.3 规避建议 109
11.3 漏洞场景2 109
11.3.1 漏洞场景分析 110
11.3.2 漏洞场景演示 110
11.3.3 规避建议 110
11.4 漏洞场景3 111
11.4.1 tx.origin全局变量和msg.sender全局变量 111
11.4.2 漏洞场景分析 111
11.4.3 漏洞场景演示 112
11.4.4 规避建议 114
11.5 本章总结 114
第12章 未检查返回值 115
12.1 低级别调用函数 115
12.2 低级别调用中产生异常的原因 115
12.3 低级别函数与普通函数调用的区别 116
12.4 漏洞场景 116
12.4.1 关于send函数 117
12.4.2 漏洞场景分析 117
12.4.3 漏洞场景演示 117
12.5 真实案例 119
12.6 漏洞预防 120
第13章 可预测随机值 121
13.1 随机数生成 121
13.1.1 区块变量作为熵源的PRNG 121
13.1.2 区块变量测试 121
13.2 漏洞场景 123
13.2.1 漏洞场景分析 123
13.2.2 漏洞场景演示 124
13.3 漏洞修复 125
第14章 时间控制漏洞 126
14.1 关于block.timestamp 126
14.2 以太坊中时间戳的合理要求 126
14.3 漏洞场景1 127
14.3.1 漏洞场景分析 127
14.3.2 漏洞场景演示 128
14.3.3 另外攻击姿势 131
14.4 漏洞场景2 132
14.5 本章总结 132
第15章 抢先交易漏洞 134
15.1 关于抢先交易漏洞 134
15.2 满足“抢先交易”的条件 134
15.3 决定交易顺序的原则 134
15.3.1 手续费高低原则 134
15.3.2 先进先出原则 135
15.3.3 共识节点排序原则 135
15.4 交易池 135
15.5 攻击流程 136
15.6 漏洞场景分析 137
15.7 漏洞场景演示 138
15.7.1 本地搭建私链 138
15.7.2 错误不期而遇 139
15.7.3 改用geth 140
15.7.4 部署合约 141
15.7.5 攻击演示 142
15.7.6 小结 143
15.8 本章总结 145
第16章 短地址攻击漏洞 147
16.1 关于短地址攻击漏洞 147
16.2 漏洞场景分析 148
16.3 攻击者地址的生成 149
16.4 漏洞场景演示 150
16.5 本章总结 152
第17章 拒绝服务漏洞 153
17.1 关于拒绝服务漏洞 153
17.2 漏洞场景1 153
17.2.1 漏洞场景演示 154
17.2.2 selfdestruct函数 155
17.3 漏洞场景2 156
17.3.1 所有者丢失 156
17.3.2 漏洞场景演示 156
17.4 漏洞场景3 158
17.5 漏洞场景4 159
17.5.1 非预期异常 159
17.5.2 攻击payload 159
17.5.3 漏洞场景演示 160
17.6 本章总结 161
第18章 账户及账户生成 162
18.1 以太坊账户 162
18.2 以太坊地址 163
18.3 外部账户的生成 163
18.4 特定外部账户的生成 167
18.5 合约账户的生成 168
18.6 Create2 170
18.6.1 关于Create2 170
18.6.2 Create code 170
18.6.3 Factory合约 171
18.7 本章总结 175
第19章 Ethernaut 176
19.1 关于Ethernaut 176
19.2 环境准备 177
19.2.1 Hello Ethernaut 177
19.2.2 安装MetaMask插件 177
19.2.3 测试网络的选择 177
19.2.4 控制台的使用 178
19.3 本章总结 178
第20章 Ethernaut Level 1 179
20.1 Level 1 Fallback 179
20.2 源码分析 180
20.2.1 fallback函数 180
20.2.2 攻击过程 181
20.3 闯关尝试 181
20.4 本章总结 183
第21章 Ethernaut Level 2~5 184
21.1 Level 2 Fallout 184
21.1.1 关卡源码 184
21.1.2 源码分析 185
21.1.3 闯关尝试 185
21.2 Level 3 CoinFlip 186
21.2.1 关卡源码 186
21.2.2 源码分析 187
21.2.3 闯关尝试 187
21.2.4 攻击payload 187
21.2.5 问题总结 190
21.3 Level 4 Telephone 190
21.3.1 关卡源码 190
21.3.2 源码分析 191
21.3.3 攻击payload 191
21.3.4 闯关尝试 191
21.4 Level 5 Token 192
21.4.1 关卡源码 192
21.4.2 源码分析 193
21.4.3 闯关尝试 193
21.5 本章总结 194
第22章 Ethernaut Level 6~9 195
22.1 Level 6 Delegation 195
22.1.1 关卡源码 195
22.1.2 源码分析 196
22.1.3 闯关尝试 197
22.1.4 另谋出路 198
22.2 Level 7 Force 199
22.2.1 关卡源码 199
22.2.2 源码分析 199
22.2.3 攻击payload 200
22.2.4 闯关尝试 200
22.3 Leval 8 Vault 201
22.3.1 关卡源码 201
22.3.2 源码分析 202
22.3.3 闯关尝试 202
22.4 Level 9 King 202
22.4.1 关卡源码 203
22.4.2 源码分析 203
22.4.3 攻击payload 204
22.4.4 闯关尝试 204
22.5 本章总结 205
第23章 Ethernaut Level 10~13 206
23.1 Level 10 Reentrance 206
23.1.1 关卡源码 206
23.1.2 源码分析 207
23.1.3 关于重入漏洞 207
23.1.4 攻击payload 207
23.1.5 闯关尝试 208
23.2 Level 11 Elevator 209
23.2.1 关卡源码 209
23.2.2 源码分析 210
23.2.3 攻击payload 210
23.2.4 闯关尝试 211
23.3 Level 12 Privacy 211
23.3.1 关卡源码 211
23.3.2 源码分析 212
23.3.3 闯关尝试 213
23.4 Level 13 GatekeeperOne 214
23.4.1 关卡源码 214
23.4.2 源码分析 215
23.4.3 攻击payload 215
23.4.4 闯关尝试 215
23.5 本章总结 218
第24章 Ethernaut Level 14~17 219
24.1 Level 14 GatekeeperTwo 219
24.1.1 关卡源码 219
24.1.2 源码分析 220
24.1.3 攻击payload 221
24.1.4 闯关尝试 221
24.2 Level 15 NaughtCoin 222
24.2.1 关卡源码 222
24.2.2 源码分析 223
24.2.3 闯关尝试 224
24.3 Level 16 Preservation 224
24.3.1 关卡源码 224
24.3.2 源码分析 225
24.3.3 攻击payload 226
24.3.4 闯关尝试 227
24.4 Level 17 Recovery 228
24.4.1 关卡源码 228
24.4.2 源码分析 229
24.4.3 闯关尝试 229
24.5 本章总结 230
第25章 Ethernaut Level 18~20 231
25.1 Level 18 MagicNumber 231
25.1.1 关卡源码 231
25.1.2 源码分析 232
25.1.3 闯关尝试 233
25.2 Level 19 AlienCodex 235
25.2.1 关卡源码 235
25.2.2 源码分析 235
25.2.3 闯关尝试 237
25.3 Level 20 Denial 238
25.3.1 关卡源码 238
25.3.2 源码分析 239
25.3.3 payload 240
25.3.4 闯关尝试 240
25.4 本章总结 242
第26章 通用payload 243