哈囉,大家好啊。
放暑假前就和幾個朋友們約好要打鐵人賽了,放假後更是卯起來推身邊的人入坑,
結果朋友拉朋友,再去跟其他團隊一起就這麼大坨了(?)
而也在因緣巧合之際,我碰到了 Ethernaut 這個平台,
本來我認為已經大致了解 Solidity 語法了,但是在過關時才發現,原來我
還有很多東西解不出來XD,甚至有少數沒看過的方法和語法,下手研究後
,啊啊啊,太好玩了 (✪ω✪),剛好 Ethernaut 的篇幅也蠻足夠的,那麼就
乾脆來一篇完整的鐵人賽好了 (?) 於是我現在就在這裡了。
智能合約發布後即無法修改,且 Code 也會完全公開,即使發現
了某個漏洞也幾乎沒有辦法能夠修補,所以才更應該學習 Solidity PWN
,使合約上架前就把漏洞排除,但,學習任何和資訊安全相關的領域通則,
是需要完全的了解,畢竟如果一知半解,要如何修補/攻擊 APP 呢 ?
並且若無基礎的認知,即使在網路上尋找相關資源,八成也是無法理解的,
所以在接下來的文章中,我會預期讀者已經擁有了 Solidity 的最最基
礎的語法概念,不打算對關鍵語法以外的語法多做解釋,希望大家可以快速服用
後就完全理解,加上我不太會寫文章QQ
而 Ethernaut 內的題目涵蓋了 Solidity 非常多的領域
除了最常聽到的溢位和重入攻擊(Re-entrancy)以外,甚至包含
了 Solidity 的組合語言、 ERC20,EIP1967,明面上
是在學習 Solidity 的漏洞,但實際上卻能讓使用者更大程度的掌握語法,
因此若是你已經有 Solidity 的基礎,我相當推薦你玩玩 Ethernaut
Ethernaut 是 Openzeppelin 團隊維護和開發的平台,
在平台上有 27 個關卡,都是和 Solidity 語法漏洞,其中不乏
許多知名的漏洞如 Re-entrancy,也因為平台的知名性,網路上
也有許多相關資源和 WriteUp,就代表著不用擔心卡關和沒有答案能核對,
因此表示能夠非常完整的掌握每道關卡的訣竅,若是你了解了某道關卡的通關方式
也可以試著用其他邏輯去通關,相信都會對讀者們在掌握 Solidity 上有更大的助益。
Ethereum 將帳戶分為
interface TargetContract {
..... external;
}
contract Attack {
TargetContract target = TargetContract(<address>)
function hack() public {
target.function_name();
}
.....
}
接下來的所有實作將高頻率的用到呼叫另一份合約的語法,所以請先了解上面的語法是如何運作的喔。
interface 就是要呼叫的 Contract 的 function
在主合約內宣告 TargetContract 並給予它目標的地址,就能夠在主合約內,以合約地址的身分呼叫目標合約的 function。
OK 那麼接下來我們將正式進入 Ethernaut 第 0 關,敬請期待。