Ethernaut 题库闯关 #6 - Delegation

今天这篇是Ethernaut题库闯关连载的第6篇题解

今天这篇是Ethernaut 题库闯关连载的第6篇,难度等级:中等。

Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。

今天是周末,原本先偷懒一下,不过说好的每日一更,必须逼自己做到。

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函数(回退函数)。在回顾它的代码之前,让我...

剩余50%的内容订阅专栏后可查看

点赞 1
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Ethernaut CTF
Ethernaut CTF
信奉 CODE IS LAW.