官方数据-蒸发货币是什么意思-零开始网络安全知识点

官方数据-蒸发货币是什么意思-零开始网络安全知识点

一行代码蒸发了¥6,447,277,680 人民币!

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

美图董事长蔡文胜曾在三点钟群,高调的说出了这句话,随即被大众疯传。

在他发表完言论没多久,2月美链(BEC)上交易所会暴涨4000%,后又暴跌。尽管他多次否认,聪明的网友早已扒出,他与BEC千丝万缕的关系。

_蒸发货币是什么意思_蒸发的货币纪录片

庄家坐庄操控币价,美图的股价随之暴涨,蔡文胜顺利完成了他的韭菜收割大计。

但在币圈,割人者,人恒割之。

随着BEC智能合约的漏洞的爆出,被黑客利用,瞬间套现抛售大额BEC,6亿在瞬间归零。

而这一切,竟然是因为一个简单至极的程序Bug。

背景

今天有人在群里说, Chain 美蜜 代码里面有bug,已经有人利用该bug获得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000. 个 BEC

那笔操作记录是

_蒸发货币是什么意思_蒸发的货币纪录片

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

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

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

整体逻辑是

你传几个地址给我(),然后再传给我你要给每个人多少代币()

然后你要发送的总金额 = 发送的人数* 发送的金额

然后 要求你当前的余额大于 发送的总金额

然后扣掉你发送的总金额

然后 给 里面的每个人发送 指定的金额()

从逻辑上看,这边是没有任何问题的,你想给别人发送代币,那么你本身的余额一定要大于发送的总金额的!

但是这段代码却犯了一个很傻的错!

代码解释

_蒸发的货币纪录片_蒸发货币是什么意思

这个方法会传入两个参数

的值是个列表,里面有两个地址

d7

33

的值是

我们再查看代码(如下图)

蒸发货币是什么意思_蒸发的货币纪录片_

我们一行一行的来解释

uint cnt = .;

是获取 里面有几个地址,我们从上面可以看到 参数里面只有两个地址,所以 cnt=2,也就是 给两个地址发送代币

= (cnt) * ;

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

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

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

也就是 假如是 uint8的话

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

也就是 0 到255

那么 的取值范围是

0 - 2的256次方-1 也就是 0 到35

算 2的256次方是多少

蒸发的货币纪录片_蒸发货币是什么意思_

那么假如说 设置的值超过了 取值范围怎么办?这种情况称为溢出

举个例子来说明

因为的取值太大了,所以用uint8来 举例。。。

从上面我们已经知道了 uint8 最小是0,最大是255

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

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

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

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

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

= (cnt) *

则 = 2*

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

( 16进制转10进制)

_蒸发货币是什么意思_蒸发的货币纪录片

可以看到 =

那么 = *2 = 36

可以在查看上面看到 取值范围最大为 35

此时,amout已经超过了最大值,溢出 则 = 0

下一行代码(cnt > 0 && cnt 0 && [msg.] >= );

这句要求 大于0,我们的是大于0 的且,当前用户拥有的代币余额大于等于 ,因为等于0,所以 就算你一个代币没有,也是满足的!

[msg.] = [msg.].sub();

这句是当前用户的余额 -

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

for (uint i = 0; i < cnt; i++) {
    balances[_receivers[i]] = balances[_receivers[i]].add(_value);
    Transfer(msg.sender, _receivers[i], _value);
}

这句是遍历 中的地址,对每个地址做以下操作

[[i]] = [[i]].add();中的地址 的余额 = 原本余额+value

所以 中地址的余额 则加了 个代币!!!

(msg., [i], ); }这句则只是把赠送代币的记录存下来!!!

总结

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

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

其实他考虑了,

蒸发的货币纪录片_蒸发货币是什么意思_

可以看如上截图

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

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

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

啥是

蒸发货币是什么意思_蒸发的货币纪录片_

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

我们看看他干了啥?为啥能保证计算安全.

function mul(uint256 a, uint256 b) internal constant returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}

如上面的乘法.他在计算后,用 验证了下结果是否正确!

如果在上面计算 的时候,用了 mul的话,则 c / a == b也就是 验证 / cnt ==

这句会执行报错的,因为 0 / cnt 不等于

所以程序会报错!

也就不会发生溢出了...

那么 还有一个小问题,这里的 好 好像是干的同一件事

都是为了验证 某条语句是否正确!

那么他俩有啥区别呢?

用了的话,则程序的gas limit 会消耗完毕

而的话,则只是消耗掉当前执行的gas

总结

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

我个人看法是

只要涉及到计算,一定要用代码一定要测试!代码一定要!必要时,要请专门做代码审计的公司来 测试代码

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

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

蒸发货币是什么意思__蒸发的货币纪录片

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

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

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

网络安全学习路线图(思维导图)

网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。

1. 网络安全视频资料

2. 网络安全笔记/面试题

3. 网安电子书PDF资料

如果你向网安入门到进阶的全套资料,我都打包整理好了,需要学习的小伙伴可以V我找我拿~

学网络安全/学黑客,零基础资料整理来啦~~~

~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值