前一段時間,有個使用者用說發交易的時候提示位址錯誤,後來發現發送的位址少了一位元組;是以錢包檢測發送位址時,會提示錯誤。當時也沒當回事,以為是使用者自己搞錯了。最近研究solidity的時候,才明白了當時是怎麼回事,原來這個使用者遇到了短位址攻擊。今天就來分析一下短位址攻擊,玩ERC20的“韭菜們”都需要注意一下,否則你會發現,你的token被自己莫奇妙的都送給别人了,到時候可沒地方說理去。
我們先來看一下正常的ERC20轉賬的交易結構是什麼樣子的。正常的ERC20的轉賬交易,from位址是你自己,to位址是你要轉賬的token合約位址,而你要轉賬賬戶位址其實是寫在input data裡;随便找一個erc20的轉賬位址大家看一下,
https://etherscan.io/tx/0xc6f6d2e9ebabe1b160fde3bd51507903cc0f40bdf4813c99d138d57b8b345f1f

大家可以看一下,我紅色标注的位址;我們着重分析一下,input data結構;如果你看了我寫的omni協定分析,有沒有覺得input data和OP_Return有點類似呢;我們把input data用兩種形勢表達一下。
解析形式:
原始形式:
對比一下兩種形式,你會發現,其實是一樣的,也就明白了input data是個什麼樣的結構;主要分為三部分。
1)四個位元組,函數名稱,transfer(address _to, uint256 _amount),這個是把函數名字做keccak256,之後取前四個位元組。
0xa9059cbb
2)32位元組,你要轉賬的位址,不足32位元組,需要補零。
000000000000000000000000641988625108585185752230bde001b3ebd0fc7a
3)32位元組,你要轉賬的數量,不足32位元組,需要補零。
00000000000000000000000000000000000000000000000000000451e804f0e0
短位址攻擊是什麼原理呢?
第一步,你的有一個位址以00結尾的賬戶位址,為什麼?暫且不表;先說說怎麼得到這種位址,你要是牛逼點,自己寫個代碼,很快就生成裡,筆者實驗了一下也就生産了2000個位址就會出現這種位址;你要是不會呢,有個叫“币合錢包”的工具打開後,選擇“靓号生成器頁籤”就可以生産你想要的位址了。就以上例位址為例,你獲得了一個641988625108585185752230bde001b3ebd0fc00的位址。
第二步,你把這個位址發給别人,但是以這種形式641988625108585185752230bde001b3ebd0fc;發現沒有最後的兩個零沒寫,為啥呢?接着看。
第三步,這就和你沒關系啦,對方拿到這個位址後要轉erc20的代币,他會建立input data,但是結果确實這樣的。
0xa9059cbb
000000000000000000000000641988625108585185752230bde001b3ebd0fc
00000000000000000000000000000000000000000000000000000451e804f0e000
第二部分少了兩個零,怎麼辦,後邊補啊;相當于藍色這兩個補到了位址上,位址後邊又補了兩個;學過計算機的都知道,左移8位相當于乘256,就是你原來想轉一個,變成了轉256了。
如果錢包、交易所做位址校驗了,那應該就不會有啥大問題。