ABI 解碼在哪裡進行?
我試圖從 Underhanded Solidity Contest中了解獲勝的契約。
該契約顯然導致 ABI 解碼器溢出,但我很難理解溢出發生在“堆棧”(不是字面堆棧,而是在構成乙太坊的技術中)的哪個位置。
通過閱讀文件和這個答案,我了解到 ABI 不是黃皮書中定義的核心乙太坊協議的一部分,但我的問題是:
需要什麼:
0x69f30401 "00000000000000000000000000000000000000000000000000000000cafebabe" "0000000000000000000000000000000000000000000000000000000000000060" "00000000000000000000000000000000000000000000000000000000000000A0" "F000000000000000000000000000000000000000000000000000000000000001" "0000000000000000000000000000000000000000000000000000000000000003" "F000000000000000000000000000000000000000000000000000000000000001" "0000000000000000000000000000000000000000000000000de0b6b3a7640000"
解碼它,並在 EVM 上執行它?交易本身是否包含上述內容^?那麼這怎麼不是核心乙太坊協議的一部分呢?我不明白你是如何從 ABI 到正在執行的 EVM 指令以及正在執行的程式碼。
如果漏洞利用依賴於 Solidity 解碼 ABI 並導致溢出,這是否意味著所有挖礦節點都在執行 Solidity?怎麼可能?
我的心智模型似乎在這裡缺少一些基本的東西。如果有時間,請提供圖表,謝謝!
ABI 編碼不是乙太坊核心協議的一部分,因為交易中的有效載荷數據不需要任何結構,它只是一個字節序列。同樣,乙太坊虛擬機也只是將數據處理為字節序列。
例如,發送到合約的交易有效載荷的前四個字節通常用於區分呼叫合約中的哪個函式。對於乙太坊和 EVM,合約只是在這個字節序列上執行的單個程序。只有像 Solidity、Viper 或 Bamboo 這樣的高級語言定義了你如何從程序的入口點到特定函式的入口點(當然你可以創建一種高級語言,它沒有函式的概念,可以從外部呼叫)。
ABI 解碼器由 Solidity 編譯器自動生成,具體取決於您在合約中定義的函式類型,函式調度常式也會根據有效負載的前四個字節呼叫正確的函式。
例如,事務包含您在問題中給出的字節序列。如何將這些字節解釋為結構化數據取決於程序,因此取決於所使用的程式語言。為了使兩個用不同程式語言編寫的程序能夠相互呼叫,這些語言的編譯器應該以相同的方式實現數據的序列化和反序列化,即它們應該實現ABI規範,但它們沒有到。