[Ethernaut]2-Fallout

Posted keelongz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Ethernaut]2-Fallout相关的知识,希望对你有一定的参考价值。

题目一览

源码:

pragma solidity ^0.4.18;

import ‘zeppelin-solidity/contracts/ownership/Ownable.sol‘;
import ‘openzeppelin-solidity/contracts/math/SafeMath.sol‘;

contract Fallout is Ownable {
  
  using SafeMath for uint256;
  mapping (address => uint) allocations;

  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

  function allocate() public payable {
    allocations[msg.sender] = allocations[msg.sender].add(msg.value);
  }

  function sendAllocation(address allocator) public {
    require(allocations[allocator] > 0);
    allocator.transfer(allocations[allocator]);
  }

  function collectAllocations() public onlyOwner {
    msg.sender.transfer(this.balance);
  }

  function allocatorBalance(address allocator) public view returns (uint) {
    return allocations[allocator];
  }
}

过关要求:

Claim ownership of the contract below to complete this level. 成为合约的所有者。

分析&求解

这题其实……先来学习一下Solidity的构造函数和析构函数吧。

其实和java有点类似,构造函数是类初始化时候执行,析构函数是销毁回收的时候执行。

构造函数的特点是,和合约名(”类名”)相同

比如下面这个例子:

pragma solidity ^0.4.13;
contract MyCoin{
? ? uint amount;
? ? address owner;
? ??
? ? function MyCoin() public{ //构造函数,和合约同名
? ? ? ? amount=90;
? ? ? ? owner=msg.sender;
? ? }
? ??
? ? function getBalance() public constant returns (uint){
? ? ? ??
? ? ? ? return amount;
? ? ? ??
? ? }
? ??
? ? function kill() public{  //析构函数,销毁时候执行
? ? ? ? if(owner==msg.sender){
? ? ? ? ? ? selfdestruct(owner);
? ? ? ? }
? ? }
}

那么来看这个题:

contract Fallout is Ownable {
  
  using SafeMath for uint256;
  mapping (address => uint) allocations;

  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

这个带注释的函数,功能就是让执行者成为合约的所有者。

可以发现,合约名是Fallout,而这个函数名是Fal1out

所以说他压根不是构造函数,合约会使用默认的构造函数(感觉就是java)

又因为修饰符是public,是个人都能调……所以:

技术图片

可以看到owner已经是我们了:

技术图片

提交,过关:

技术图片

过关之后给了一个小故事,原来真有开发的犯过这个错误,改了合约名没改构造函数:

技术图片

以上是关于[Ethernaut]2-Fallout的主要内容,如果未能解决你的问题,请参考以下文章

blockchain | 区块链安全靶场 The Ethernaut

Ethernaut 靶场刷题(上)

ERC20代币学习与合约编写

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js