资讯专栏INFORMATION COLUMN

一行代码损失了???RMB

Shihira / 2918人阅读

摘要:下面的代码就没有意义了,不需要解释了。。。合约的问题当然是做加减乘除的时候没有用逻辑还有一个问题正常来说,应该需要加一个判断,被授权的金额不能大于要发送的金额。。。总结我发现了攻击这个合约的人已经攻击了很多合约了这一些币大家就别抄底了

背景

又发现一个ERC20 超级大的漏洞

这个漏洞严重到什么情况呢?

你的钱不再是你的钱,任何人都可以把你的钱转走,你也可以转走任何人的钱

那笔操作记录是 0x9a6a0ba68214db82ec6fd12ee3a6b4cf1143ec963974d7a5edf97e08b6c482ca


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

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

那这个方法是干嘛的呢?(从某个人 转钱到 另外一个人 )

这个方法有一个配套的方法approve,你授权某个人用多少你的钱。。。

所以,这两个方法的使用场景是,

举个例子:

我授权我儿子使用我的100块钱,那我先调用approve
然后 我儿子要用钱的时候,调用transferFrom 来用我的钱,当然用一次少一次(而且每次用的钱不能超过我授权的钱)

代码解释
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
    /// same as above
    require(_to != 0x0);
    require(balances[_from] >= _value);
    require(balances[_to] + _value > balances[_to]);

    uint previousBalances = balances[_from] + balances[_to];
    balances[_from] -= _value;
    balances[_to] += _value;
    allowed[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    assert(balances[_from] + balances[_to] == previousBalances);

    return true;
}

这个方法会传入三个参数

_from :在用谁的钱

_to : 把钱给谁

_value : 准备用多少钱

require(_to != 0x0);
require(balances[_from] >= _value);
require(balances[_to] + _value > balances[_to]);

这三行是一些强制要求

你不能把钱转给0x0,也就是空地址

你在用谁的钱(那么这个人的余额一定要大于 你要用的钱)

你转给的那个人钱,那么那个人的余额一定要大于 之前的余额(也就是不能转个-1之类的,导致他余额反而变少了)

uint previousBalances = balances[_from] + balances[_to];
balances[_from] -= _value;
balances[_to] += _value;

这三行

算出两个人余额的总数

from 那个人的余额 - value

to 那个人的余额 + value

allowed[_from][msg.sender] -= _value;

这一行我们分解下
allowed[_from][msg.sender] 是 当前方法调用的人(msg.sender)可以使用(_from) 多少钱

也就是假如 我授权了我儿子100块,那么

allowed我的地址 = 100(这边的msg.sender 需要是我儿子的地址,如果是别人的话,我没有授权给他,则是0

所以这一行原本的意思是 (我儿子用了多少授权的金额,那么总授权金额需要 减掉 被用掉的)

但是呢。。。因为没用用safemath...导致任何人都能通过这一行(也就是 0- value)

0-value是不会报错的(当然如果用safemath的话,是会报错的。。。)

所以呢,只要你找到一个有钱人的地址,,,然后就可以吧他的钱全部转给任何账户。。。

下面的代码就没有意义了,不需要解释了。。。

而且他这个合约 没有暂停的方法。。。

导致现在任何人都可以调用这个合约。。。

合约的问题

当然是做加减乘除的时候没有用safemath

逻辑还有一个问题

正常来说,应该需要加一个 判断,被授权的金额 不能大于 要发送的金额。。。

require(allowed[_from][msg.sender] >= _value);

这样的话 后面也就不会有这些事情了。。。

总结

我发现了 攻击这个合约的人 已经攻击了很多合约了!!!

这一些币大家就别抄底了!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24121.html

相关文章

  • 当Kotlin邂逅设计模式之代理模式(二)

    摘要:简述从这篇文章起,我们将继续邂逅设计模式系列篇中的第二篇代理模式。代理模式可以说很多初级中级开发者迷惑的设计模式。首先我们需要使用类图直观地表示出代理模式思想。所以基于代理模式很轻松就实现。简述: 从这篇文章起,我们将继续Kotlin邂逅设计模式系列篇中的第二篇代理模式。代理模式可以说很多初级中级开发者迷惑的设计模式。但是它确实应用很广,不用多说大家非常熟悉的Retrofit框架,内部使用了...

    番茄西红柿 评论0 收藏0
  • 当Kotlin邂逅设计模式之代理模式(二)

    摘要:简述从这篇文章起,我们将继续邂逅设计模式系列篇中的第二篇代理模式。代理模式可以说很多初级中级开发者迷惑的设计模式。首先我们需要使用类图直观地表示出代理模式思想。所以基于代理模式很轻松就实现。简述: 从这篇文章起,我们将继续Kotlin邂逅设计模式系列篇中的第二篇代理模式。代理模式可以说很多初级中级开发者迷惑的设计模式。但是它确实应用很广,不用多说大家非常熟悉的Retrofit框架,内部使用了...

    legendaryedu 评论0 收藏0
  • PHP闭包(Closure)初探

    摘要:实现闭包将匿名函数在普通函数中当做参数传入,也可以被返回。如果将匿名函数返回给外界,匿名函数会保存所引用的变量,而外界则不能得到这些变量,这样形成闭包这个概念可能会更清晰一些。 原文:http://my.oschina.net/melonol/blog/126694 匿名函数提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数...

    roadtogeek 评论0 收藏0
  • 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染

    摘要:老规矩,爬之前首先感谢淘宝公布出这么多有价值的数据,才让我们这些爬虫们有东西可以搜集啊,不过淘宝就不用我来安利了广大剁手党相信睡觉的时候都能把网址打出来吧。 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取 都已经三节课了,大家活动活动手脚,咱们开始一场...

    Tecode 评论0 收藏0
  • 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染

    摘要:老规矩,爬之前首先感谢淘宝公布出这么多有价值的数据,才让我们这些爬虫们有东西可以搜集啊,不过淘宝就不用我来安利了广大剁手党相信睡觉的时候都能把网址打出来吧。 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取 都已经三节课了,大家活动活动手脚,咱们开始一场...

    lx1036 评论0 收藏0

发表评论

0条评论

Shihira

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<