打開金庫(Vault)來通過這一關ㄅ!
這題是打開金庫,就是把 locked
變成 false
就可以了
只要在合約 13 行的 unlock(bytes32 _password)
輸入正確的密碼,就可以改變locked
的值。所以只要取得 password
的值就可以解開這題。
智能合約的特色就是所有的資料和操作都會上鏈。雖然 password
被宣告為 private
,但依然會被存在鏈上。所以我們要算出他被儲存在合約的哪裡。
在 Solidity 中,合約的狀態變數都會被存在 storage slot 中,storage slot 會被實際寫入到區塊鏈上,每個合約可以有 \(2^{256}\) 個 slot,每個 slot 可以存放 256 bit(32 bytes)。今天如果兩個變數宣告的長度都沒有超過 32 bytes 會被放入同一個 slot 中。
Tip
Solidity 變數分為三種:
關於 storage slot 可以看以下幾篇有更詳細的解釋:
這題合約中的變數有兩個,分別是bool locked
和 bytes32 password
。按照儲存規則,slot 會長這樣:
slot idx | (type)Variable |
---|---|
0 | (bool) locked |
1 | (bytes32) password |
所以我們要讀取 slot 1 取得 password
,再呼叫 unlock(bytes32 _password)
,關於讀取的方法我是用 Foundry 的 vm.load 完成,攻擊合約如下: