前言
前段時間,PolyNetwork被盜事件的一個小插曲,一地址向黑客地址轉賬在inputdata中告知其USDT已被凍結,不要使用USDT,黑客知曉后向該地址轉賬13.37ETH。
事后很多人便通過inputData在區塊鏈上“聊天”向黑客“索要”虛擬貨幣,那么我們經常在區塊鏈瀏覽器中看到的inputData到底是什么?知道創宇區塊鏈安全實驗室為您解答。
Inputdata
在以太坊協議中,當交易為合約創建時,inputdata是賬戶初始化程序的EVM代碼;
而當交易為消息調用時,inputdata是合約函數調用數據。
正常情況下簡單的消息調用如調用轉賬函數時需要填寫你要轉賬的地址_to和你要轉賬的數量_amount,這些基本信息都包含在inputdata里面。
我們通過一個調用合約的轉賬交易具體分析,來理解消息調用時inputdata的結構。
解析形式:
原始形式:
已破產的Voyager自開放提款已出現約2.5億美元的凈流出:金色財經報道,根據Dune?Analytics的數據,現已破產的加密貨幣貸款機構Voyager自6月23日重新激活提款功能以來,已出現約2.5億美元的凈流出。
Dune數據顯示,從7月3日開始的一周內,Voyager出現了大量提款,用戶提走了價值6400萬美元的?BTC?、7400 萬美元的USDC和超過 1700 萬美元的ETH。還有SHIB和其他加密貨幣的大量提款。
此外,Arkham數據顯示,截至7月10日,該貸方當前的加密貨幣持有余額為1.7598億美元。[2023/7/10 10:46:32]
我們將原始的inputdata分為三個部分進行分析:
0xa9059cbb:函數標識符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一個參數為address即你要轉賬的地址,并補位到32字節即64個16進制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二個參數為value即你要轉賬的數量,并補位到32字節即64個16進制字符
通過對比分析我們可以發現inputdata的基本結構為函數標識符+參數。
法國敦促美國在氣候補貼方面保持透明度:2月4日消息,法國財長勒梅爾呼吁美國和歐洲在有爭議的綠色補貼和稅收減免問題上保持“透明度”。美國《通脹削減法案》(IRA)為美國能源轉型提供了3700億美元的補貼,包括對美國制造的電動汽車和電池減稅。“我們必須現實一點。IRA是游戲規則的改變者,”
勒梅爾稱。“IRA提供了競爭優勢,再加上美國非常低的能源價格,對我們的工業構成了風險。”勒梅爾說:“最重要的是,我們與盟國合作,使補貼和稅收抵免的數額透明化。”勒梅爾表示,歐盟委員會已經提出了與美國補貼一致的條款,“但為了使這些一致條款發揮作用,我們仍然需要知道補貼的數額。”(金十)[2023/2/4 11:47:31]
函數標識符
這里的函數標識符即為函數選擇器,根據官方文檔可知函數選擇器是某個函數簽名的Keccak哈希的前4字節。
我們可以通過代碼bytess4(keccake256("transfer(adddress,uint256)"))或者在線工具獲取這種函數簽名。
下圖可以看出加密結果的前四個字節(a9059cbb)跟inputdata中函數標識符一致。
這里之所以要將函數簽名截斷到四個字節是考慮到Gas成本問題。
在一筆交易中0字節需要支付4gas,而非0字節需要68gas也就是0字節的17倍。
Aptos宣布與韓國3A游戲工作室NPIXEL達成合作:11月15日消息,Aptos宣布與韓國3A游戲工作室NPIXEL達成合作,把Web3游戲提升到一個新的水平。[2022/11/16 13:09:35]
在SHA-3加密中生成的32字節隨機字符串更傾向于多的非0字節,所以大概成本是32x68=2176gas,而截斷成本大概為4x68=272gas,可見截斷到四個字節能夠節省約8倍的gas費。
而函數標識符的作用是指定調用哪一個函數,在同一個合約中兩個不同函數的SHA-3簽名的前4字節相同的概率是十分小的,所以截斷到四個字節實際不會影響函數調用。
參數
在evm執行字節碼的約定中,靜態類型左補齊零至64長度,而動態類型則是右補齊零至64長度。
歸納下常見的靜態類型:uint,bool,Address,bytes,動態數組類型:bytes,string,address,bytes32.....
我們通過pyethereum的ABI編碼函數來研究不同數據類型的編碼方式。
靜態類型
先導入encode_abi函數
importrlpfromethereum.abiimportencode_abi
我們以函數transfer(address,uint256)為例
>encode_abi(,
).hex()
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
數據:尼日利亞成為非洲最大的加密市場:9月4日消息,根據Triple A最新數據,非洲大陸擁有BTC、ETH等數字資產的人數達到5300萬,在全球加密持有者(3.2億)中占比16.5%;在非洲,加密持有者人數最多的國家是尼日尼亞,超過2200萬人,全球排名第四,僅次于美國(4600萬)、印度(2740萬)以及巴基斯坦(2640萬)。(Nairametrics)[2022/9/4 13:08:10]
0000000000000000000000000000000000000000000000000000000000000001
對于小于32字節的定長數組會被自動填充到32字節:
>encode_abi("],).hex()
//自動填充0
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
動態類型
動態類型編碼要稍微復雜一些,需要先計算偏移量進行占位處理,我們通過一個簡單的例子來具體說明。
>encode_abi(","uint256","uint256"],
美國消費者通脹預期由14年高點回落 美聯儲激進加息的緊迫性或降:6月25日消息,根據密歇根大學消費者信心指數6月終值,美國消費者的更長期通脹預期從6月初值報告中的14年高點回落,可能會降低美聯儲激進加息的緊迫性。美聯儲主席鮑威爾此前表示,密歇根大學數據以及其他近期的通脹指標,幫助指引決策者加息75個基點,而不是50個基點。標普500指數周五在上述報告發布后躍升,兩年期美國國債上漲。密歇根大學消費者信心指數6月終值報50,創紀錄低點,略低于初值。對經濟衰退即將到來的擔憂日益升溫之際,該數據的急劇下降反映出通脹率處于數十年高位、過去一個月股價大跌以及對經濟狀況的看法普遍不佳。(金十)[2022/6/25 1:30:38]
,,]
).hex()
//參數1的偏移量:32*3=96十六進制0x600000000000000000000000000000000000000000000000000000000000000060
//參數2的偏移量=參數1偏移量+參數1數據部分長度=96+32*4=224十六進制0xE000000000000000000000000000000000000000000000000000000000000000e0
//參數3的偏移量=參數2偏移量+參數2數據部分長度=224+32*4=352十六進制0x1600000000000000000000000000000000000000000000000000000000000000160
//偏移量0x60位置開始傳入參數1的數據
0000000000000000000000000000000000000000000000000000000000000003//元素個
00000000000000000000000000000000000000000000000000000000000000a1//第一個數組元素
00000000000000000000000000000000000000000000000000000000000000a2//第二個數組元素
00000000000000000000000000000000000000000000000000000000000000a3//第三個數組元素
//0xe0位置。參數2的數據
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000b1
00000000000000000000000000000000000000000000000000000000000000b2
00000000000000000000000000000000000000000000000000000000000000b3
//0x160位置。參數3的數據
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000c1
00000000000000000000000000000000000000000000000000000000000000c2
00000000000000000000000000000000000000000000000000000000000000c3
短地址攻擊
經過前面的分析當靜態類型如address長度不足32字節時EVM會根據規則將長度補齊到32字節,如果當轉賬的地址以00結尾,如0x641988625108585185752230bde001b3ebd0fc00,轉賬時將地址后面的兩個零去掉,EVM依然會認為address_to是32位的,所以它會從_value的高位取0來補充,amount的位數會多兩位也就是會乘以256。
攻擊過程如下:
將惡意轉賬地址最后一個字節的0去掉
函數標識符:a9059cbb
轉賬地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc
轉賬金額:
00000000000000000000000000000000000000000000000000000000000000001
由于EVM的補位規則,解析結果為:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100
我們分解后發現,轉賬金額已經多了兩位也就是多了一個字節,即為原來轉賬的256倍
函數標識符:a9059cbb
轉賬地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc00
轉賬金額:
00000000000000000000000000000000000000000000000000000000000000100
如何在inputdata附著信息
在以太坊中直接進行轉賬交易的inputdata字段默認是沒有內容的,但是我們可以通過設置錢包實現文章開頭的“聊天功能”。
我們以MetaMask錢包為例展示如何通過轉賬在inputdata字段附著一些額外的信息。
1、首先我們需要打開錢包高級選項的顯示十六進制數據開關
2、在轉賬時將你要附著的信息通過十六進制編碼后填入下方十六進制數據中,記得在開頭加上0x然后進行轉賬
3、轉賬成功后在etherscan中就能夠看到附著信息
總結
我們能夠通過交易中的inputdata將一些信息永久存儲在區塊鏈中,可以通過此項技術在食品藥品監管部門的產品防偽溯源、財稅部門的電子票據打假驗真、學術成果存證等方面實現應用落地。
ZONFF投資人說是ZonffPartners關于投資、商業、科技以及未來的深度思考。本文約4000字閱讀時長約15分鐘作者:Colin秉承著開放、公平、高效的理念,互聯網已經蓬勃發展了近四十年.
1900/1/1 0:00:00Channels是一個多鏈創新DeFi借貸協議,上線至今一年時間里從未發生過任何安全事故。目前已上線Heco、BSC和Arbitrum,是跨鏈抵押借貸平臺.
1900/1/1 0:00:00DAOrayakiDAO研究獎金池:BlockScience正在研究和開發一種用于高維、半可替代資產的新型價格發現機制.
1900/1/1 0:00:00有一種流行的獨創網絡的策略,我喜歡稱之為"始于功能,終于社交網絡"。最開始,用一個單人工具吸引用戶,然后隨著時間的推移,讓他們參與到網絡社交中.
1900/1/1 0:00:00加密貨幣和區塊鏈技術一直在顛覆全球的多個行業,如金融、游戲、供應鏈管理和數字身份。但如果我們告訴你,加密貨幣的影響力并僅僅不局限于一個地球呢?這是真的.
1900/1/1 0:00:00又是新的一周,NFT領域又一次的瘋狂。Beeple創下了新的銷售記錄,但對于買家而言,這并不是傳統的NFT.
1900/1/1 0:00:00