Skip to content

Latest commit

 

History

History
64 lines (54 loc) · 2.18 KB

09.01-ethernaut第三题.md

File metadata and controls

64 lines (54 loc) · 2.18 KB

Fallout

题目

获得以下合约的所有权来完成这一关.

提示

  • Solidity Remix IDE

源码

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "openzeppelin-contracts-06/math/SafeMath.sol";

contract Fallout {
    //启用SafeMath库中的函数用于uint256类型
    using SafeMath for uint256;
    
    //定义了一个映射,记录每个地址的分配金额
    mapping(address => uint256) allocations;
    //定义了一个公开的可支付地址变量owner,用于存储合约所有者的地址。
    address payable public owner;

    /* constructor */
    //Fal1out()函数,任何人都可以调用,public
    function Fal1out() public payable {
        //调用者成为合约拥有者
        owner = msg.sender;
       //记录发送到合约的金额
        allocations[owner] = msg.value;
    }

    //修饰符确保只有合约所有者可以调用标记了onlyOwner的函数
    modifier onlyOwner() {
        require(msg.sender == owner, "caller is not the owner");
        _;
    }

    //允许用户向合约发送以太币,并记录他们的分配金额
    function allocate() public payable {
        allocations[msg.sender] = allocations[msg.sender].add(msg.value);
    }

    //允许用户将他们的分配金额发送到指定的地址
    function sendAllocation(address payable allocator) public {
        require(allocations[allocator] > 0);
        allocator.transfer(allocations[allocator]);
    }

    //允许合约所有者提取合约中的所有余额
    function collectAllocations() public onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

    //允许查询指定地址的分配余额。
    function allocatorBalance(address allocator) public view returns (uint256) {
        return allocations[allocator];
    }
}

解题思路

很明显,在定义构造函数时,将合约名 Fallout 误写为 Fal1out ,这导致这个函数成为了一个普通的 public 函数。任何人都可以在合约创建后调用这个函数,成为合约主人。

解题过程

1.contract.Fal1out() //调用构造函数Fal1out来获取合约的ower权限 2.contract.owner() // 查看合约拥有者