摘要:下面的代碼就沒有意義了,不需要解釋了。。。合約的問題當然是做加減乘除的時候沒有用邏輯還有一個問題正常來說,應該需要加一個判斷,被授權的金額不能大于要發送的金額。。。總結我發現了攻擊這個合約的人已經攻擊了很多合約了這一些幣大家就別抄底了
背景
又發現一個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);
這樣的話 后面也就不會有這些事情了。。。
總結我發現了 攻擊這個合約的人 已經攻擊了很多合約了!!!
這一些幣大家就別抄底了!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24121.html
摘要:簡述從這篇文章起,我們將繼續邂逅設計模式系列篇中的第二篇代理模式。代理模式可以說很多初級中級開發者迷惑的設計模式。首先我們需要使用類圖直觀地表示出代理模式思想。所以基于代理模式很輕松就實現。簡述: 從這篇文章起,我們將繼續Kotlin邂逅設計模式系列篇中的第二篇代理模式。代理模式可以說很多初級中級開發者迷惑的設計模式。但是它確實應用很廣,不用多說大家非常熟悉的Retrofit框架,內部使用了...
摘要:實現閉包將匿名函數在普通函數中當做參數傳入,也可以被返回。如果將匿名函數返回給外界,匿名函數會保存所引用的變量,而外界則不能得到這些變量,這樣形成閉包這個概念可能會更清晰一些。 原文:http://my.oschina.net/melonol/blog/126694 匿名函數提到閉包就不得不想起匿名函數,也叫閉包函數(closures),貌似PHP閉包實現主要就是靠它。聲明一個匿名函數...
摘要:老規矩,爬之前首先感謝淘寶公布出這么多有價值的數據,才讓我們這些爬蟲們有東西可以搜集啊,不過淘寶就不用我來安利了廣大剁手黨相信睡覺的時候都能把網址打出來吧。 系列教程: 手把手教你寫電商爬蟲-第一課 找個軟柿子捏捏 手把手教你寫電商爬蟲-第二課 實戰尚妝網分頁商品采集爬蟲 手把手教你寫電商爬蟲-第三課 實戰尚妝網AJAX請求處理和內容提取 都已經三節課了,大家活動活動手腳,咱們開始一場...
摘要:老規矩,爬之前首先感謝淘寶公布出這么多有價值的數據,才讓我們這些爬蟲們有東西可以搜集啊,不過淘寶就不用我來安利了廣大剁手黨相信睡覺的時候都能把網址打出來吧。 系列教程: 手把手教你寫電商爬蟲-第一課 找個軟柿子捏捏 手把手教你寫電商爬蟲-第二課 實戰尚妝網分頁商品采集爬蟲 手把手教你寫電商爬蟲-第三課 實戰尚妝網AJAX請求處理和內容提取 都已經三節課了,大家活動活動手腳,咱們開始一場...
閱讀 923·2023-04-26 01:34
閱讀 3356·2023-04-25 20:58
閱讀 3260·2021-11-08 13:22
閱讀 2108·2019-08-30 14:17
閱讀 2522·2019-08-29 15:27
閱讀 2673·2019-08-29 12:45
閱讀 2996·2019-08-29 12:26
閱讀 2811·2019-08-28 17:51