当前位置:   article > 正文

c++判断整数翻转溢出_智能合约安全审计 | 整数溢出

library safemath [function mul(uint a, uint b) internal returns (uint) fuint
e0669c2ac6fa34abc4f584ae47507fb3.png 921b31a038139f6f301d2a386e135115.gif

4c492a62ca165bb945921870896f0bd5.png

溢出攻击事件

2018年4月22日, 黑客对BEC智能合约发起攻击,凭空取出
57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968

个BEC代币并在市场上进行抛售,BEC随即急剧贬值,价值几乎为0,该市场瞬间土崩瓦解。

2018年4月25日,SMT项目方发现其交易存在异常,黑客利用其函数漏洞创造了

65,133,050,195,990,400,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + 50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000

的SMT币,火币Pro随即暂停了所有币种的充值提取业务。

2018年12月27日,以太坊智能合约Fountain(FNT)出现整数溢出漏洞,黑客利用其函数漏洞创造了

2 + 115792089237316195423570985008687907853269984665640564039457584007913129639935

的SMT币。

让我们一起以沉痛的心情缅怀以上一夜归零的代币。

整数溢出简介

整数溢出原理

通常来说,在编程语言里由算数问题导致的整数溢出漏洞屡见不鲜,在区块链的世界里,智能合约的Solidity语言中也存在整数溢出问题,整数溢出一般分为又分为上溢和下溢,在智能合约中出现整数溢出的类型包括三种:

  • 乘法溢出

  • 加法溢出

  • 减法溢出

在Solidity语言中,变量支持的整数类型步长以8递增,支持从uint8到uint256,以及int8到int256。例如,一个 uint8类型 ,只能存储在范围 0到2^8-1,也就是[0,255] 的数字,一个 uint256类型 ,只能存储在范围 0到2^256-1的数字。

在以太坊虚拟机(EVM)中为整数指定固定大小的数据类型,而且是无符号的,这意味着在以太坊虚拟机中一个整型变量只能有一定范围的数字表示,不能超过这个制定的范围。

如果试图存储 256这个数字 到一个 uint8类型中,这个256数字最终将变成 0,所以整数溢出的原理其实很简单,为了说明整数溢出原理,这里以 8 (uint8)位无符整型为例,8 位整型可表示的范围为 [0, 255],255 在内存中存储按位存储的形式为下图所示:

343c3ae4404403430bedef236d3a34d6.png

8 位无符整数 255 在内存中占据了 8bit 位置,若再加上 1 整体会因为进位而导致整体翻转为 0,最后导致原有的 8bit 表示的整数变为 0 。
上图即说明了智能合约中整 数上溢的原理,同样整数下溢也是一样,如 (uint8)0 - 1 = (uint8)255。 溢出简单实例演示,这里以uint256类型演示:
  1. pragma solidity ^0.4.25;contract POC{
  2. //加法溢出 //如果uint256 类型的变量达到了它的最大值(2**256 - 1),如果在加上一个大于0的值便会变成0 function add_overflow() returns (uint256 _overflow) {
  3. uint256 max = 2**256 - 1; return max + 1; } //减法溢出 //如果uint256 类型的变量达到了它的最小值(0),如果在减去一个小于0的值便会变成2**256-1(uin256类型的最大值) function sub_underflow() returns (uint256 _underflow) {
  4. uint256 min = 0; return min - 1; } //乘法溢出 //如果uint256 类型的变量超过了它的最大值(2**256 - 1),最后它的值就会回绕变成0 function mul_overflow() returns (uint256 _underflow) {
  5. uint256 mul
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/935024?site
推荐阅读
相关标签
  

闽ICP备14008679号