摘要:下面的代碼就沒有意義了,不需要解釋了。。。合約的問題當(dāng)然是做加減乘除的時候沒有用邏輯還有一個問題正常來說,應(yīng)該需要加一個判斷,被授權(quán)的金額不能大于要發(fā)送的金額。。。總結(jié)我發(fā)現(xiàn)了攻擊這個合約的人已經(jīng)攻擊了很多合約了這一些幣大家就別抄底了
背景
又發(fā)現(xiàn)一個ERC20 超級大的漏洞
這個漏洞嚴(yán)重到什么情況呢?
你的錢不再是你的錢,任何人都可以把你的錢轉(zhuǎn)走,你也可以轉(zhuǎn)走任何人的錢
那筆操作記錄是 0x9a6a0ba68214db82ec6fd12ee3a6b4cf1143ec963974d7a5edf97e08b6c482ca
下面我來帶大家看看,黑客是如何實(shí)現(xiàn)的!
我們可以看到執(zhí)行的方法是 transferFrom
那這個方法是干嘛的呢?(從某個人 轉(zhuǎn)錢到 另外一個人 )
這個方法有一個配套的方法approve,你授權(quán)某個人用多少你的錢。。。
所以,這兩個方法的使用場景是,
舉個例子:
我授權(quán)我兒子使用我的100塊錢,那我先調(diào)用approve
然后 我兒子要用錢的時候,調(diào)用transferFrom 來用我的錢,當(dāng)然用一次少一次(而且每次用的錢不能超過我授權(quán)的錢)
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; }
這個方法會傳入三個參數(shù)
_from :在用誰的錢
_to : 把錢給誰
_value : 準(zhǔn)備用多少錢
require(_to != 0x0); require(balances[_from] >= _value); require(balances[_to] + _value > balances[_to]);
這三行是一些強(qiáng)制要求
你不能把錢轉(zhuǎn)給0x0,也就是空地址
你在用誰的錢(那么這個人的余額一定要大于 你要用的錢)
你轉(zhuǎn)給的那個人錢,那么那個人的余額一定要大于 之前的余額(也就是不能轉(zhuǎn)個-1之類的,導(dǎo)致他余額反而變少了)
uint previousBalances = balances[_from] + balances[_to]; balances[_from] -= _value; balances[_to] += _value;
這三行
算出兩個人余額的總數(shù)
from 那個人的余額 - value
to 那個人的余額 + value
allowed[_from][msg.sender] -= _value;
這一行我們分解下
allowed[_from][msg.sender] 是 當(dāng)前方法調(diào)用的人(msg.sender)可以使用(_from) 多少錢
也就是假如 我授權(quán)了我兒子100塊,那么
allowed我的地址 = 100(這邊的msg.sender 需要是我兒子的地址,如果是別人的話,我沒有授權(quán)給他,則是0
所以這一行原本的意思是 (我兒子用了多少授權(quán)的金額,那么總授權(quán)金額需要 減掉 被用掉的)
但是呢。。。因?yàn)闆]用用safemath...導(dǎo)致任何人都能通過這一行(也就是 0- value)
0-value是不會報(bào)錯的(當(dāng)然如果用safemath的話,是會報(bào)錯的。。。)
所以呢,只要你找到一個有錢人的地址,,,然后就可以吧他的錢全部轉(zhuǎn)給任何賬戶。。。
下面的代碼就沒有意義了,不需要解釋了。。。
而且他這個合約 沒有暫停的方法。。。
導(dǎo)致現(xiàn)在任何人都可以調(diào)用這個合約。。。
合約的問題當(dāng)然是做加減乘除的時候沒有用safemath
邏輯還有一個問題
正常來說,應(yīng)該需要加一個 判斷,被授權(quán)的金額 不能大于 要發(fā)送的金額。。。
require(allowed[_from][msg.sender] >= _value);
這樣的話 后面也就不會有這些事情了。。。
總結(jié)我發(fā)現(xiàn)了 攻擊這個合約的人 已經(jīng)攻擊了很多合約了?。。?br>
這一些幣大家就別抄底了!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24121.html
摘要:簡述從這篇文章起,我們將繼續(xù)邂逅設(shè)計(jì)模式系列篇中的第二篇代理模式。代理模式可以說很多初級中級開發(fā)者迷惑的設(shè)計(jì)模式。首先我們需要使用類圖直觀地表示出代理模式思想。所以基于代理模式很輕松就實(shí)現(xiàn)。簡述: 從這篇文章起,我們將繼續(xù)Kotlin邂逅設(shè)計(jì)模式系列篇中的第二篇代理模式。代理模式可以說很多初級中級開發(fā)者迷惑的設(shè)計(jì)模式。但是它確實(shí)應(yīng)用很廣,不用多說大家非常熟悉的Retrofit框架,內(nèi)部使用了...
摘要:實(shí)現(xiàn)閉包將匿名函數(shù)在普通函數(shù)中當(dāng)做參數(shù)傳入,也可以被返回。如果將匿名函數(shù)返回給外界,匿名函數(shù)會保存所引用的變量,而外界則不能得到這些變量,這樣形成閉包這個概念可能會更清晰一些。 原文:http://my.oschina.net/melonol/blog/126694 匿名函數(shù)提到閉包就不得不想起匿名函數(shù),也叫閉包函數(shù)(closures),貌似PHP閉包實(shí)現(xiàn)主要就是靠它。聲明一個匿名函數(shù)...
摘要:老規(guī)矩,爬之前首先感謝淘寶公布出這么多有價值的數(shù)據(jù),才讓我們這些爬蟲們有東西可以搜集啊,不過淘寶就不用我來安利了廣大剁手黨相信睡覺的時候都能把網(wǎng)址打出來吧。 系列教程: 手把手教你寫電商爬蟲-第一課 找個軟柿子捏捏 手把手教你寫電商爬蟲-第二課 實(shí)戰(zhàn)尚妝網(wǎng)分頁商品采集爬蟲 手把手教你寫電商爬蟲-第三課 實(shí)戰(zhàn)尚妝網(wǎng)AJAX請求處理和內(nèi)容提取 都已經(jīng)三節(jié)課了,大家活動活動手腳,咱們開始一場...
摘要:老規(guī)矩,爬之前首先感謝淘寶公布出這么多有價值的數(shù)據(jù),才讓我們這些爬蟲們有東西可以搜集啊,不過淘寶就不用我來安利了廣大剁手黨相信睡覺的時候都能把網(wǎng)址打出來吧。 系列教程: 手把手教你寫電商爬蟲-第一課 找個軟柿子捏捏 手把手教你寫電商爬蟲-第二課 實(shí)戰(zhàn)尚妝網(wǎng)分頁商品采集爬蟲 手把手教你寫電商爬蟲-第三課 實(shí)戰(zhàn)尚妝網(wǎng)AJAX請求處理和內(nèi)容提取 都已經(jīng)三節(jié)課了,大家活動活動手腳,咱們開始一場...
閱讀 933·2023-04-26 01:34
閱讀 3367·2023-04-25 20:58
閱讀 3310·2021-11-08 13:22
閱讀 2121·2019-08-30 14:17
閱讀 2533·2019-08-29 15:27
閱讀 2682·2019-08-29 12:45
閱讀 3007·2019-08-29 12:26
閱讀 2821·2019-08-28 17:51