一行Python代码蒸发了¥6,447,277,680 人民币!凭空消失?恐怖!

现在进入你还是先行者,最后观望者进场才是韭菜。

背景

 

 

下面我来带大家看看,黑客是如何实现的!

我们可以看到执行的方法是 batchTransfer

那这个方法是干嘛的呢?(给指定的几个地址,发送相同数量的代币)

 

 

 

 

 

扫描二维码关注公众号,回复: 1754125 查看本文章

uint256

首先 uint256(cnt) 是把cnt 转成了 uint256类型

那么,什么是uint256类型?或者说uint256类型的取值范围是多少…

uintx 类型的取值范围是 0 到 2的x次方 -1

也就是 假如是 uint8的话

则 uint8的取值范围是 0 到 2的8次方 -1

也就是 0 到255

那么uint256 的取值范围是

 

那么当我 255 + 2 的时候,结果是啥呢?结果会变成1

那么当我 0 – 1 的时候,结果是啥呢?结果会变成255

那么当我 0 – 2 的时候,结果是啥呢?结果会变成254

那么 我们回到上面的代码中,

 

但是此时 _value 是16进制的,我们把他转成 10进制

(python 16进制转10进制)

 

可以看到 _value = 57896044618658097711785492504343953926634992332820282019728792003956564819968

 

这句是当前用户的余额 – amount

当前amount 是0,所以当前用户代币的余额没有变动

 

总结

就一个简单的溢出漏洞,导致BEC代币的市值接近归0

那么,开发者有没有考虑到溢出问题呢?

其实他考虑了,

 

可以看如上截图

除了amount的计算外, 其他的给用户转钱 都用了safeMath 的方法(sub,add)

那么 为啥就偏偏这一句没有用safeMath的方法呢。。。

这就要用写代码的人了。。。

啥是safeMath

 

safeMath 是为了计算安全 而写的一个library

 

总结

那么 我们如何避免这种问题呢?

我个人看法是

  1. 只要涉及到计算,一定要用safeMath
  2. 代码一定要测试!
  3. 代码一定要review!
  4. 必要时,要请专门做代码审计的公司来 测试代码

这件事后需要如何处理呢?

目前,该方法已经暂停了(还好可以暂停)所以看过文章的朋友 不要去测试了…

 

不过已经发生了的事情咋办呢?

我能想到的是,快照在漏洞之前,所有用户的余额情况

然后发行新的token,给之前的用户 发送等额的代币…

进群:125240963  即可获取数十套PDF书籍

猜你喜欢

转载自www.cnblogs.com/fcxwz/p/9224205.html