1. 主页
  2. 文档
  3. Ethernaut 题库闯关
  4. #6 Delegation

#6 Delegation

Ethernaut 挑战 #6:Delegation

本关的目标是获取目标合约的所有权。

本关闯关设计到 3 个知识点:

  1. 了解 Solidity关于 “delegatecall” 低级函数,delegatecall是如何工作的,如何使用它将操作委托给链上的库,以及它对执行范围有什么影响。
  2. 了解 Fallback 方法
  3. 了解函数选择器

以下是合约代码:

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

contract Delegate {

  address public owner;

  constructor(address _owner) public {
    owner = _owner;
  }

  function pwn() public {
    owner = msg.sender;
  }
}

contract Delegation {

  address public owner;
  Delegate delegate;

  constructor(address _delegateAddress) public {
    delegate = Delegate(_delegateAddress);
    owner = msg.sender;
  }

  fallback() external {
    (bool result,) = address(delegate).delegatecall(msg.data);
    if (result) {
      this;
    }
  }
}

我们唯一的目标是获得 “Delegation “合约的所有权。

在查看解题思路之前,可以先自己想一想,自己会怎么做?

这里有两个合约:

  • Delegate.sol
  • Delegation.sol是我们需要索取所有权的合约。

研究合约

Delegate.sol

Delegate.sol合约真的很简单。

它有一个address public owner状态变量,一个constructor(address _owner),设置owner变量的初始值。

然后有一个奇怪的函数,叫做 “pwn”,代码如下:

function pwn() public {
    owner = msg.sender;
}

该函数的调用者将成为合约的所有者。这一点对我们来说并不重要,因为我们不需要获得这个合约的所有权,但只要记住这一点就可以了,因为接下来要做的事情。

Delegation.sol

这就是我们可以直接访问的合约。它有两个状态变量。

  • address public owner一个公共变量,用于存储合约的所有者。
  • Delegate delegate是对我们刚刚看到的Delegate合约的引用。

合约的constructoraddress _delegateAddress作为唯一的输入参数,用它初始化delegate状态变量,用msg.sender初始化所有者。

然后就是fallback函数(回退函数)。在回顾它的代码之前,让我…

这篇文章对您有用吗?

我们要如何帮助您?