區塊鏈趣步DAPP合約模式系統開發丨去中心化DAPP系統開發方案
什麼是短地址攻擊
大家都知道,如果我們想呼叫智慧合約的函式,需要在交易的payload欄位中填充一段位元組碼。以ERC20的transfer()的函式為例,函式原型為:
function transfer(address to, uint amount) public returns (bool success);
我們需要透過一段68個位元組的位元組碼來呼叫該函式進行轉賬,比如:
a9059cbb000000000000000000000000146aed09cd9dea7a64de689c5d3ef73d2ee5ca000000000000000000000000000000000000000000000000000000000000000001
具體可以分解為3個部分:
4位元組函式簽名:a9059cbb
to引數:000000000000000000000000146aed09cd9dea7a64de689c5d3ef73d2ee5ca00
amount引數:0000000000000000000000000000000000000000000000000000000000000001
大家可能注意到,這個轉賬地址有點特殊:最後兩個數字為0。
假如有個使用者“不小心”忘記輸入最後這兩個0了怎麼辦?這樣我們的輸入就只有67個位元組了。EVM是透過CALLDATALOAD指令從輸入資料中獲取函式引數的,因此它會先從後面的amount引數裡“借”兩個0來補足前面的地址引數。當它要載入amount引數的時候,發現位數不夠,會在右邊補0,參見以太坊原始碼:
所以,經過這麼一折騰,實際上EVM看到是下面這些引數:
4位元組函式簽名:a9059cbb
to引數:000000000000000000000000146aed09cd9dea7a64de689c5d3ef73d2ee5ca00(借0)
amount引數:0000000000000000000000000000000000000000000000000000000000000100(補0)
看到問題了沒?轉賬地址沒變,但是轉賬金額增大了256倍!如果你的轉賬地址後面有足夠多的0,那麼轉賬金額將會大得驚人~
但是有人會說,這沒啥毛用啊,難道智慧合約的作者會傻到不檢查你地址的餘額,就直接讓你提幣走人嗎?我猜想這跟目前中心化交易所的運營機制相關。考慮下面的場景:使用者充幣到交易所錢包,交易所又把這些幣轉移到了它們內部的合約賬戶中。等使用者發起提幣申請,並透過人工稽核後,再從合約中把幣打到使用者的賬戶中。
在這種情況下,交易的msg.sender就是交易所本身,因此可以透過餘額檢查。當然,這裡有個前提:你必須能夠透過人工稽核!也就是稽核員失職。實際上,從沒有人成功利用過這個漏洞,發現這個問題的GNT專案組,也僅僅是觀察到一筆異常交易而已,並沒有產生任何實質性損失。網路上流傳的攻擊方法是:先找到一個裡面有足夠數量代幣的交易所賬戶,充1000個幣進去,然後再申請提1000個幣,就可以提出來256000個幣。但是,在我看來這似乎並不可行,如果有讀友能想出可行的場景,歡迎給我留言~
2.現在還能重現嗎?
能。
當然,不能透過常規的方式。不能透過remix,因為客戶端會檢查地址長度。也不能透過sendTransaction(),因為web3中也加了保護。但是,我們可以使用sendRawTransaction()。
2.1先寫一個簡單合約
pragma solidity ^0.4.25;
contract ABC {
mapping (address => uint) balances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
constructor() public {
balances[msg.sender] = 10000;
}
function transfer(address to, uint amount) public returns(bool success) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
function getBalance(address addr) public view returns(uint) {
return balances[addr];
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983064/viewspace-2948725/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Fintoch分投趣模式系統開發/區塊鏈DAPP合約模式區塊鏈APP
- 區塊鏈趣步DAPP智慧合約合約系統技術開發詳情區塊鏈APP
- 區塊鏈、代幣DAPP合約模式系統開發講解方案區塊鏈APP模式
- 趣步智慧合約模式系統開發dapp技術模式APP
- 長沙區塊鏈DAPP智慧合約系統開發方案區塊鏈APP
- DAPP系統開發邏輯丨DAPP系統開發功能丨合約DAPP系統開發技術APP
- JAva智慧合約DAPP系統開發(區塊鏈)JavaAPP區塊鏈
- 關於區塊鏈趣步模式DAPP系統開發專案方案(成熟技術)區塊鏈模式APP
- 區塊鏈/趣步DAPP/智慧合約系統開發/合約跟單/python技術詳情區塊鏈APPPython
- DAPP合約系統開發技術丨DAPP馬蹄鏈系統開發成熟DmeoAPP
- DAPP區塊鏈挖礦專案系統開發丨智慧合約程式開發APP區塊鏈
- 區塊鏈去中心化DAPP系統開發技術(成熟技術)區塊鏈中心化APP
- Uniswap丨justswap丨pancakeswap系統開發(去中心化DAPP)中心化APP
- DAPP合約系統開發邏輯技術丨DAPP成熟系統開發技術方案APP
- 如何開發DAPP系統|去中心化應用系統模式APP中心化模式
- 區塊鏈智慧合約DApp開發系統公鏈質押挖礦系統開發區塊鏈APP
- 鏈上DAPP系統開發|智慧合約DAPP開發搭建APP
- 去中心化鏈上矩陣公排互助dapp系統開發智慧合約部署方案中心化矩陣APP
- 智慧合約Dapp系統開發(方案)APP
- 區塊智慧合約DAPP軟體系統開發APP
- NFT鏈遊專案系統開發模式方案丨NFT鏈遊DAPP合約系統開發技術講解模式APP
- Demo區塊鏈DAPP合約系統開發技術講解理念方案丨(原始碼搭建)區塊鏈APP原始碼
- DAPP馬蹄鏈智慧合約系統開發(案例)丨DAPP馬蹄鏈開發原始碼APP原始碼
- DAPP 系統開發操作及功能丨智慧合約專案系統開發方案APP
- DAPP去中心化合約模式系統開發(技術說明)APP中心化模式
- DAPP眾籌智慧合約系統開發原理丨眾籌模式分析丨dapp眾籌系統APP模式
- DAPP代幣挖礦模式系統開發|DAPP合約APP模式
- dapp合約代幣理財系統開發方案模式APP模式
- 區塊鏈商城dapp系統開發技術詳情丨區塊鏈商城dapp開發原始碼案例部署區塊鏈APP原始碼
- 分投趣fintoch去中心化交易平臺dapp系統開發智慧合約部署詳情中心化APP
- 九層天塔DAPP系統開發技術|鏈上智慧合約dapp開發方案APP
- 趣味運動零擼趣步系統模式開發丨DAPP丨Defi丨NFT模式APP
- 去中心化區塊鏈錢包支付系統開發模式中心化區塊鏈模式
- DApp智慧合約系統開發APP
- NFT鏈遊功能開發丨DAPP智慧合約遊戲系統技術開發模式APP遊戲模式
- 淺談區塊鏈DAPP專案系統開發模式詳細方案區塊鏈APP模式
- 馬蹄鏈智慧合約DAPP開發需求丨馬蹄鏈智慧合約DAPP質押挖礦系統開發(開發案例)APP
- 合約質押模式系統開發DAPP模組丨質押系統開發技術邏輯方案模式APP