前言

实际上整形溢出并不仅仅是在智能合约中出现问题,在其他的地方也有出现。只不过我感觉我好像没咋遇到过。。。还是我太菜了。。
学习参考:
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相关推荐

  1. Floating-Point overflow and underflow

    (一)What will happen if so ? Floating-Point Overflow and Underflow  Suppose the biggest possible floa ...

  2. Integer overflow, simple but not easy

    Our analysis and further investigation on proxyOverflow (CVE-2018–10376) and batchOverflow (CVE-2018 ...

  3. 数值计算中的overflow and underflow

    数值计算中的overflow and underflow 以softmax为例 实数在计算机内用二进制标识,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出,而指数函数容易出现无穷大 ...

  4. 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 ...

  5. Line 14: Char 23: runtime error: signed integer overflow: 746384741 * 10 cannot be represented

    问题描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 问题解决: class Solution { public:bool isPalindrome(i ...

  6. signed integer overflow报错解决

    1 + 2147483647 超过了int边界 原来代码: long mid=(low+high)/2; Line 6: Char 30: runtime error: signed integer ...

  7. overflow and underflow

    Q: 什么叫underflow, 什么叫overflow? 对于很多的AI问题,如果出现很多概率的相乘,我们通常都在最前面加log, 为什么? ⽐如 argmax p(x), 通常求解 argmax ...

  8. 类型的Overflow与underflow

    Overflow:值超过了该类型所能表示的最大值 Underflow:值低于该类型所能表示的最小值 例如: short int  val=32767://short是两个字节,最高位是符号位 //va ...

  9. C: integer overflow,隐式类型转换/整数加法溢出 解决方法示例;check_add_overflow;__builtin_add_overflow

    文章目录 简介 怎么理解 类型转换 gcc 对指针overflow的 检查 64 位变量,隐式转换成32位 实例 整数加法溢出,解决方法 Linux Linux 另一例 GCC也提供了相似的功能 dp ...

最新文章

  1. 【python教程入门学习】Pandas库下载和安装
  2. 《动手玩转Arduino》——2.4 展望
  3. c0000005错误怎么解决_iTunes提示3194未知错误怎么办【解决方法】
  4. 职业生涯中的愚蠢想法
  5. 九度 1474:矩阵幂(二分法)
  6. C++求三位数的水仙花数
  7. 华为EMUI10带来开发者福音:一次开发多端部署
  8. ARM学习篇 中断定时理解
  9. LXReorderableCollectionViewFlowLayout
  10. python中实例和对象的区别_通过Python中对象实例的属性比较对象实例是否相等
  11. Web性能测试篇:AB 压力测试
  12. win10/win7 usb转串口驱动下载
  13. 谷歌添加vue开发工具插件
  14. ORB_SLAM3系统框图
  15. xiuno4.0 火车头发布模块一Web登陆版
  16. 按键精灵读取github page 网页,实现脚本远程控制功能
  17. 【2】基因功能注释之SwissProt和Interproscan
  18. Percolator事务模型
  19. 黑龙江省佳木斯市谷歌高清卫星地图下载
  20. shell脚本读取配置文件【有图有真相】

热门文章

  1. Graham算法构造凸包(python)
  2. 如何在网页标题前添加图标
  3. 在日本做科研工作是怎样的体验?
  4. 作业 20180925-4 单元测试,结对
  5. Linux——进程间通信
  6. 移动开发APP的开发框架
  7. 电脑通过wifi连接手机(adb移动设备连接电脑)
  8. Ubuntu16.04 anaconda 上安装 opencv
  9. Redis ZADD命令
  10. 水果店节日活动营销方案,水果店如何做营销活动