今天这篇是Ethernaut题库闯关连载的第6篇题解
今天这篇是Ethernaut 题库闯关连载的第6篇,难度等级:中等。
Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。
今天是周末,原本先偷懒一下,不过说好的每日一更,必须逼自己做到。
本关的目标是获取目标合约的所有权。
本关闯关设计到 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
合约真的很简单。
它有一个address public owner
状态变量,一个constructor(address _owner)
,设置owner
变量的初始值。
然后有一个奇怪的函数,叫做 "pwn",代码如下:
function pwn() public {
owner = msg.sender;
}
该函数的调用者将成为合约的所有者。这一点对我们来说并不重要,因为我们不需要获得这个合约的所有权,但只要记住这一点就可以了,因为接下来要做的事情。
这就是我们可以直接访问的合约。它有两个状态变量。
address public owner
一个公共变量,用于存储合约的所有者。Delegate delegate
是对我们刚刚看到的Delegate
合约的引用。合约的constructor
把address _delegateAddress
作为唯一的输入参数,用它初始化delegate
状态变量,用msg.sender
初始化所有者。
然后就是fallback
函数(回退函数)。在回顾它的代码之前,让我...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!