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

溢出攻击事件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项目方发现...
摘要由CSDN通过智能技术生成
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类型演示:
pragma solidity ^0.4.25;contract POC{
        //加法溢出    //如果uint256 类型的变量达到了它的最大值(2**256 - 1),如果在加上一个大于0的值便会变成0    function add_overflow() returns (uint256 _overflow) {
            uint256 max = 2**256 - 1;        return max + 1;    }  //减法溢出  //如果uint256 类型的变量达到了它的最小值(0),如果在减去一个小于0的值便会变成2**256-1(uin256类型的最大值)  function sub_underflow() returns (uint256 _underflow) {
          uint256 min = 0;      return min - 1;  }        //乘法溢出  //如果uint256 类型的变量超过了它的最大值(2**256 - 1),最后它的值就会回绕变成0  function mul_overflow() returns (uint256 _underflow) {
          uint256 mul 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值