www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]今天(4月23日)有人在群里說,Beauty Chain 美蜜 代碼里面有bug,已經(jīng)有人利用該bug獲得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個 BEC

現(xiàn)在進(jìn)入你還是先行者,最后觀望者進(jìn)場才是韭菜。

背景

今天(4月23日)有人在群里說,Beauty Chain 美蜜 代碼里面有bug,已經(jīng)有人利用該bug獲得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個 BEC

那筆操作記錄是 0xad89ff16fd1ebe3a0a7cf4ed282302c06626c1af33221ebe0d3a470aba4a660f

下面我來帶大家看看,黑客是如何實(shí)現(xiàn)的!

我們可以看到執(zhí)行的方法是 batchTransfer

那這個方法是干嘛的呢?(給指定的幾個地址,發(fā)送相同數(shù)量的代幣)

整體邏輯是

你傳幾個地址給我(receivers),然后再傳給我你要給每個人多少代幣(value)

然后你要發(fā)送的總金額 = 發(fā)送的人數(shù)* 發(fā)送的金額

然后 要求你當(dāng)前的余額大于 發(fā)送的總金額

然后扣掉你發(fā)送的總金額

然后 給receivers 里面的每個人發(fā)送 指定的金額(value)

從邏輯上看,這邊是沒有任何問題的,你想給別人發(fā)送代幣,那么你本身的余額一定要大于發(fā)送的總金額的!

但是這段代碼卻犯了一個很傻的錯!

代碼解釋

 

這個方法會傳入兩個參數(shù)

_receivers

_value

_receivers 的值是個列表,里面有兩個地址

0x0e823ffe018727585eaf5bc769fa80472f76c3d7

0xb4d30cac5124b46c2df0cf3e3e1be05f42119033

_value 的值是 8000000000000000000000000000000000000000000000000000000000000000

我們再查看代碼(如下圖)

我們一行一行的來解釋

uint cnt = _receivers.length;

是獲取 _receivers 里面有幾個地址,我們從上面可以看到 參數(shù)里面只有兩個地址,所以 cnt=2,也就是 給兩個地址發(fā)送代幣

uint256 amount = uint256(cnt) * _value;

uint256

首先 uint256(cnt) 是把cnt 轉(zhuǎn)成了 uint256類型

那么,什么是uint256類型?或者說uint256類型的取值范圍是多少...

uintx 類型的取值范圍是 0 到 2的x次方 -1

也就是 假如是 uint8的話

則 uint8的取值范圍是 0 到 2的8次方 -1

也就是 0 到255

那么uint256 的取值范圍是

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

python 算 2的256次方是多少

那么假如說 設(shè)置的值超過了 取值范圍怎么辦?這種情況稱為 溢出

舉個例子來說明

因?yàn)閡int256的取值太大了,所以用uint8來 舉例。。。

從上面我們已經(jīng)知道了 uint8 最小是0,最大是255

那么當(dāng)我 255 + 1 的時候,結(jié)果是啥呢?結(jié)果會變成0

那么當(dāng)我 255 + 2 的時候,結(jié)果是啥呢?結(jié)果會變成1

那么當(dāng)我 0 - 1 的時候,結(jié)果是啥呢?結(jié)果會變成255

那么當(dāng)我 0 - 2 的時候,結(jié)果是啥呢?結(jié)果會變成254

那么 我們回到上面的代碼中,

amount = uint256(cnt) * _value

amount = 2* _value

但是此時 _value 是16進(jìn)制的,我們把他轉(zhuǎn)成 10進(jìn)制

(python 16進(jìn)制轉(zhuǎn)10進(jìn)制)

可以看到 _value = 57896044618658097711785492504343953926634992332820282019728792003956564819968

那么amount = _value*2 = 115792089237316195423570985008687907853269984665640564039457584007913129639936

可以在查看上面看到 uint256取值范圍最大為 115792089237316195423570985008687907853269984665640564039457584007913129639935

此時,amout已經(jīng)超過了最大值,溢出 則 amount = 0

下一行代碼 require(cnt > 0 && cnt <= 20); require 語句是表示該語句一定要是正確的,也就是 cnt 必須大于0 且 小于等于20

我們的cnt等于2,通過!

require(_value > 0 && balances[msg.sender] >= amount);

這句要求 value 大于0,我們的value是大于0 的 且,當(dāng)前用戶擁有的代幣余額大于等于 amount,因?yàn)閍mount等于0,所以 就算你一個代幣沒有,也是滿足的!

balances[msg.sender] = balances[msg.sender].sub(amount);

這句是當(dāng)前用戶的余額 – amount

當(dāng)前amount 是0,所以當(dāng)前用戶代幣的余額沒有變動

for (uint i = 0; i < cnt; i++) {

balances[_receivers[i]] = balances[_receivers[i]].add(_value);

Transfer(msg.sender, _receivers[i], _value);

}

這句是遍歷 _receivers中的地址, 對每個地址做以下操作

balances[_receivers[i]] = balances[_receivers[i]].add(_value);

_receivers中的地址的余額 = 原本余額+value

所以 _receivers 中地址的余額 則加了57896044618658097711785492504343953926634992332820282019728792003956564819968 個代幣!!!

Transfer(msg.sender, _receivers[i], _value); } 這句則只是把贈送代幣的記錄存下來!!!

總結(jié)

就一個簡單的溢出漏洞,導(dǎo)致BEC代幣的市值接近歸0

那么,開發(fā)者有沒有考慮到溢出問題呢?

其實(shí)他考慮了,

可以看如上截圖

除了amount的計(jì)算外, 其他的給用戶轉(zhuǎn)錢 都用了safeMath 的方法(sub,add)

那么 為啥就偏偏這一句沒有用safeMath的方法呢。。。

這就要問寫代碼的人了。。。

啥是safeMath

 

safeMath 是為了計(jì)算安全 而寫的一個library

我們看看他干了啥?為啥能保證計(jì)算安全.

function mul(uint256 a, uint256 b) internal constant returns (uint256) {

uint256 c = a * b;

assert(a == 0 || c / a == b);

return c;

}

如上面的乘法. 他在計(jì)算后,用assert 驗(yàn)證了下結(jié)果是否正確!

如果在上面計(jì)算 amount的時候,用了 mul的話, 則 c / a == b 也就是 驗(yàn)證 amount / cnt == _value

這句會執(zhí)行報(bào)錯的,因?yàn)?0 / cnt 不等于 _value

所以程序會報(bào)錯!

也就不會發(fā)生溢出了...

那么 還有一個小問題,這里的 assert 好 require 好像是干的同一件事

都是為了驗(yàn)證 某條語句是否正確!

那么他倆有啥區(qū)別呢?

用了assert的話,則程序的gas limit 會消耗完畢

而require的話,則只是消耗掉當(dāng)前執(zhí)行的gas

總結(jié)

那么 我們?nèi)绾伪苊膺@種問題呢?

我個人看法是

只要涉及到計(jì)算,一定要用safeMath

代碼一定要測試!

代碼一定要review!

必要時,要請專門做代碼審計(jì)的公司來 測試代碼

這件事后需要如何處理呢?

目前,該方法已經(jīng)暫停了(還好可以暫停)所以看過文章的朋友 不要去測試了...

不過已經(jīng)發(fā)生了的事情咋辦呢?

我能想到的是,快照在漏洞之前,所有用戶的余額情況

然后發(fā)行新的token,給之前的用戶 發(fā)送等額的代幣...

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

阿聯(lián)酋迪拜2025年8月26日 /美通社/ -- 納斯達(dá)克上市公司Robo.ai Inc.今日正式宣布完成品牌煥新升級,并于8月26日正式啟用全新納斯達(dá)克股票代碼"...

關(guān)鍵字: AI 人工智能 代碼 智能科技

北京2025年8月13日 /美通社/ -- 近日,北京積算科技有限公司(以下簡稱"積算科技")推出一站式AlphaFold3在線算力服務(wù),現(xiàn)已開放免費(fèi)使用。其內(nèi)置優(yōu)化后的AlphaFold3模型,支持...

關(guān)鍵字: ALPHA 代碼 圖形化 蛋白質(zhì)

北京2025年7月21日 /美通社/ -- 浪潮信息宣布元腦企智一體機(jī)已率先完成對Kimi K2 萬億參數(shù)大模型的適配支持,并實(shí)現(xiàn)單用戶70 tokens/s的流暢輸出速度,為企業(yè)客戶高效部署應(yīng)用大模型提供高處...

關(guān)鍵字: 模型 AGENT TOKEN 代碼

7月18日,一則“微信安卓安裝包出現(xiàn)5處fxxk”的話題,迅速登上微博熱搜,吸引了眾多網(wǎng)友的熱議和關(guān)注。

關(guān)鍵字: 代碼 程序員

共鑒AI未來,緬懷先輩貢獻(xiàn) 深圳 2025年5月21日 /美通社/ -- 5月16日下午,深圳市金澄智創(chuàng)AI+傳承迎來了喬遷之喜,一場意義非凡的活動在新址盛大舉行?;顒蝇F(xiàn)場星光熠熠,莊世平前輩之子莊榮新先生、南方財(cái)經(jīng)...

關(guān)鍵字: AI AI技術(shù) BSP 代碼

C語言代碼優(yōu)化與性能提升是軟件開發(fā)中至關(guān)重要的一環(huán)。優(yōu)化C語言代碼不僅可以提高程序的執(zhí)行效率,還可以減少資源消耗,提升用戶體驗(yàn)。

關(guān)鍵字: C語言 代碼

Qt 路線圖致力于實(shí)現(xiàn)與各行業(yè)技術(shù)棧的無縫集成,助力企業(yè)與開發(fā)者使用自選工具,更高效地構(gòu)建、擴(kuò)展和維護(hù)軟件解決方案。 芬蘭埃斯波 2025年5月7日 /美通社/ -- 在今日舉行的2025年Qt全球峰會上,Qt...

關(guān)鍵字: GROUP 生態(tài)系統(tǒng) 開發(fā)者 代碼

——首批"專家級數(shù)字員工"部署上崗,構(gòu)建組織傳承與人才戰(zhàn)略的AI導(dǎo)師矩陣 北京2025年4月25日 /美通社/ -- 在生成式AI技術(shù)加速重構(gòu)組織能力與人才機(jī)制的當(dāng)下,如何留住專家經(jīng)驗(yàn)、培養(yǎng)管理人才...

關(guān)鍵字: AI 智能體 矩陣 代碼

深圳2025年4月21日 /美通社/ --?近日,國家發(fā)展改革委公布第 31 批國家企業(yè)技術(shù)中心認(rèn)定名單,華測檢測認(rèn)證集團(tuán)股份有限公司(股票代碼:300012.SZ,簡稱 "CTI 華測檢測")憑借在檢驗(yàn)檢測領(lǐng)域的全鏈條...

關(guān)鍵字: TI IC 代碼 半導(dǎo)體

珠海2025年3月13日 /美通社/ -- 近期,AI工具DeepSeek引發(fā)廣泛關(guān)注,大量非專業(yè)投資者試圖借助其生成股票策略,卻面臨現(xiàn)實(shí)困境:平臺輸出的Python代碼策略對零編程基礎(chǔ)用戶存在極高使用門檻。即...

關(guān)鍵字: EPS 代碼 PSE AI
關(guān)閉