仔細看下面的合約程式碼。
要通過這關你需要
可能會有用的資訊
來看一下合約,可以發現最終目標 withdraw()
有 onlyOwner()
modifier保護住
在執行withdraw()
之前,要先通過onlyOwner()
的檢查
msg.sender
(傳送交易的人) 需要等於預定義的 owner
owner
在deploy contract時透過一次性constructor
function定義好不過,在code之中看到了一絲希望
The receive function is executed on a call to the contract with empty calldata.
https://docs.soliditylang.org/en/v0.8.1/contracts.html#receive-ether-function
owner
所以攻擊思路出現了
contribute()
讓 contributions[msg.sender] > 0
receive()
, update ownerwithdrawal()
用以下格式,傳送msg.value
要求
檢查目前的owner,並且發送sendTransaction()
以此觸發receive()
重新檢查owner可以發現已經被update了,
最後呼叫withdraw()
確保合約的balance已經被提款出來,提交結束這關