Solidity Integer Overflow and Underflow
前言
实际上整形溢出并不仅仅是在智能合约中出现问题,在其他的地方也有出现。只不过我感觉我好像没咋遇到过。。。还是我太菜了。。
学习参考:
underflow-overflow
Integer Overflow and Underflow
Integer Overflow
整形溢出其实还是比较常见的,尤其是编程入门学的基本就是C语言,C语言就有这样的问题。但是自己主要还是一直在接触PHP和Python,因此对于整形溢出就没那么敏感了。
一个简单的例子:
pragma solidity <=0.9.0;contract test1 {uint public number=2**256-1;function add(uint num) public {number+=num;}
}
uint即uint256,最大的位数是256位,所能表示的最大的整数是2^256-1。那么如果在已经表示最大的情况下又加了1呢?
成功出现了溢出,导致uint256从2^256+1溢出到了0。
原理非常的简单,那么具体该怎么利用呢?看一下ctfwiki的这个例子:
pragma solidity ^0.4.21;contract TokenSaleChallenge {mapping(address => uint256) public balanceOf;uint256 constant PRICE_PER_TOKEN = 1 ether;function TokenSaleChallenge(address _player) public payable {require(msg.value == 1 ether);}function isComplete() public view returns (bool) {return address(this).balance < 1 ether;}function buy(uint256 numTokens) public payable {require(msg.value == numTokens * PRICE_PER_TOKEN);balanceOf[msg.sender] += numTokens;}function sell(uint256 numTokens) public {require(balanceOf[msg.sender] >= numTokens);balanceOf[msg.sender] -= numTokens;msg.sender.transfer(numTokens * PRICE_PER_TOKEN);}
}
注意这里的PRICE_PER_TOKEN = 1 ether
,单位换算如下:
assert(1 wei == 1);
assert(1 gwei == 1e9);
assert(1 ether == 1e18);
注意buy的函数:
require(msg.value == numTokens * PRICE_PER_TOKEN);
虽然这里的单位是1 ether,但是要知道它前面的类型是uint256,本地试试:
uint public price = 1 ether;
因此就会发现,这里的numTokens * PRICE_PER_TOKEN
存在溢出问题。要么要怎么溢出呢?这是在buy函数里,msg.value是随消息发送的 wei 的数量。因此这里是要花最少的前,买更多的Token。因此这里的numTokens取 2**256//1**18+1
,这样就可以成功以低价买到超过的Tokens,然后再sell出去,很nice。
Integer Underflow
整形下溢出就同理了,之前的重入攻击也已经遇到过了,也确实这个下溢出经常配合重入攻击来使用。
看一下ctfwiki的例子:
contract Bank {mapping(address => uint256) public balanceOf;...function withdraw(uint256 amount) public {require(balanceOf[msg.sender] - amount >= 0);balanceOf[msg.sender] -= amount;msg.sender.send.value(amount)();}
}
这个例子我一开始也没看出来到底有什么问题,主要还是php和python的那种数据没有大小限制和类型限制的那种思想太根深蒂固了。
关键在于这里:balanceOf[msg.sender] - amount >= 0
。
要知道二者都是uint类型,因此无论怎么减,得到的肯定也还是uint,因此一定是>=0的,只不过会发生下溢出。因此这里其实就是无限取款了。
正确的写法:
require(balanceOf[msg.sender] >= amount)
看来还是要多注意这些,感觉自己特别容易写出这种有问题的代码。。。
防御
整数溢出漏洞可以使用 SafeMath 库来防御,当发生溢出时会回滚交易。
总结
学习了一波Integer Overflow and Underflow,接下来再去刷2个题目加深一下印象。
Solidity Integer Overflow and Underflow相关推荐
- Floating-Point overflow and underflow
(一)What will happen if so ? Floating-Point Overflow and Underflow Suppose the biggest possible floa ...
- Integer overflow, simple but not easy
Our analysis and further investigation on proxyOverflow (CVE-2018–10376) and batchOverflow (CVE-2018 ...
- 数值计算中的overflow and underflow
数值计算中的overflow and underflow 以softmax为例 实数在计算机内用二进制标识,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出,而指数函数容易出现无穷大 ...
- Line 14: Char 22: runtime error: signed integer overflow: 1000000000 * 9 cannot be represented
Line 14: Char 22: runtime error: signed integer overflow: 1000000000 * 9 cannot be represented in ty ...
- Line 14: Char 23: runtime error: signed integer overflow: 746384741 * 10 cannot be represented
问题描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 问题解决: class Solution { public:bool isPalindrome(i ...
- signed integer overflow报错解决
1 + 2147483647 超过了int边界 原来代码: long mid=(low+high)/2; Line 6: Char 30: runtime error: signed integer ...
- overflow and underflow
Q: 什么叫underflow, 什么叫overflow? 对于很多的AI问题,如果出现很多概率的相乘,我们通常都在最前面加log, 为什么? ⽐如 argmax p(x), 通常求解 argmax ...
- 类型的Overflow与underflow
Overflow:值超过了该类型所能表示的最大值 Underflow:值低于该类型所能表示的最小值 例如: short int val=32767://short是两个字节,最高位是符号位 //va ...
- C: integer overflow,隐式类型转换/整数加法溢出 解决方法示例;check_add_overflow;__builtin_add_overflow
文章目录 简介 怎么理解 类型转换 gcc 对指针overflow的 检查 64 位变量,隐式转换成32位 实例 整数加法溢出,解决方法 Linux Linux 另一例 GCC也提供了相似的功能 dp ...
最新文章
- 【python教程入门学习】Pandas库下载和安装
- 《动手玩转Arduino》——2.4 展望
- c0000005错误怎么解决_iTunes提示3194未知错误怎么办【解决方法】
- 职业生涯中的愚蠢想法
- 九度 1474:矩阵幂(二分法)
- C++求三位数的水仙花数
- 华为EMUI10带来开发者福音:一次开发多端部署
- ARM学习篇 中断定时理解
- LXReorderableCollectionViewFlowLayout
- python中实例和对象的区别_通过Python中对象实例的属性比较对象实例是否相等
- Web性能测试篇:AB 压力测试
- win10/win7 usb转串口驱动下载
- 谷歌添加vue开发工具插件
- ORB_SLAM3系统框图
- xiuno4.0 火车头发布模块一Web登陆版
- 按键精灵读取github page 网页,实现脚本远程控制功能
- 【2】基因功能注释之SwissProt和Interproscan
- Percolator事务模型
- 黑龙江省佳木斯市谷歌高清卫星地图下载
- shell脚本读取配置文件【有图有真相】