Difficulty: 2/10
Level: https://ethernaut.openzeppelin.com/level/0x5732B2F88cbd19B6f01E3a96e9f0D90B917281E5
先看通关要求:获取合约所有权
分析代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| // SPDX-License-Identifier: MIT pragma solidity ^0.6.0;
import '@openzeppelin/contracts/math/SafeMath.sol';
contract Fallout { using SafeMath for uint256; mapping (address => uint) allocations; address payable public owner;
/* constructor */ function Fal1out() public payable { owner = msg.sender; allocations[owner] = msg.value; }
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 (uint) { return allocations[allocator]; } }
|
直接调用函数:
此题背后的故事:
Rubixi的故事在以太坊生态中非常知名。 这个公司把名字从 ‘Dynamic Pyramid’ 改成 ‘Rubixi’ 但是不知道怎么地,他们没有把合约的 constructor 方法也一起更名:
contract Rubixi {
address private owner;
function DynamicPyramid() { owner = msg.sender; }
function collectAllFees() { owner.transfer(this.balance) }
…
这让攻击者可以调用旧合约的constructor 然后获得合约的控制权,然后再获得一些资产。是的,这些重大错误在智能合约的世界是有可能的。
以前的合约使用和合约同名的函数作为constructor使用,所以才会有这一题。而经过语法改善,现在已经用constructor 关键字来定义。
最后提交,本关完成。