抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Delegate

1. 题目要求

  • 1.1 这一关的目标是申明你对你创建实例的所有权.

  • 这可能有帮助

    • 仔细看solidity文档关于 delegatecall 的低级函数, 他怎么运行的, 他如何将操作委托给链上库, 以及他对执行的影响.
    • Fallback 方法
    • 方法 ID
  • 1.2 题目代码:

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
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Delegate {

address public owner;

constructor(address _owner) {
owner = _owner;
}

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

contract Delegation {

address public owner;
Delegate delegate;

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

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

2. 分析

  • 2.1 elegation.sol

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

    • address public owner存储合约所有者的公共变量
    • Delegate delegate``Delegate对我们刚刚看到的合同的引用

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

  • 2.2 通过修改燃料限制的方法,出错了。。。

  • 开始网上寻找解决方法,解决方法:修改编辑燃料费选项为 “高级”

3. 解题

  • 3.1 获取关卡实例地址:0x6eE471bd0AE8A991C76972ADB0365D7cfC4e3fE9

  • 3.2 通过实例地址调用合约

  • image-20230224160918693

  • 3.3 调用Dlegate合约中的 pwn()函数,将燃料限制从29328修改为39328

  • image-20230224161521841

  • 3.3 发现做错了

  • image-20230224162138693

  • wwww….. 弄了好久,原来是需要修改编辑燃料费选项, 将其设置为“高级”

  • image-20230224163914932

  • 3.4 再次调用pwn() 函数,地址修改成功

  • image-20230224163757087

  • 3.5 到EtherScan 查看交易记录,发现成功调用pwn函数

  • image-20230224164012122

  • 3.6 提交实例并查看结果

  • image-20230224163549442

  • 3.7 成功!!!!

tips:1.参考博客 2. 参考视频

评论



政策 · 统计 | 本站使用 Volantis 主题设计