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

Force

1. 题目要求

  • 1.1 题目:

  • 这一关的目标是使合约的余额大于0

    这可能有帮助:

    • Fallback 方法
    • 有时候攻击一个合约最好的方法是使用另一个合约.
    • 阅读上方的帮助页面, “Beyond the console” 部分
  • 1.2 要求: 使合约的余额大于0

  • 1.3 合约代码:

1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Force {/*

MEOW ?
/\_/\ /
____/ o o \
/~____ =ø= /
(______)__m_m)

*/}

2. 分析

  • 2.1 我看到这个合约首先是挺无语的哈哈哈哈🤣🤣🤣

  • 2.2 合约中没有没有fallback和receive函数接收以太,也没有任何一个payable的函数可以接收以太,所以我们只能强制给该合约打钱

  • 2.3 由于合约中什么都没有,所以我们唯一能解决这个挑战的就是使用方法selfdestruct()

  • 2.4 selfdestruct()函数的解释: selfdestruct命令可以用来删除智能合约,并将该合约剩余ETH转到指定地址。selfdestruct是为了应对合约出错的极端情况而设计的。它最早被命名为suicide(自杀),但是这个词太敏感。为了保护抑郁的程序员,改名为selfdestruct

  • selfdestruct() 函数的使用:

  • image-20230224170947882

  • 2.5 攻击合约

1
2
3
4
5
6
contract Exploiter { 
constructor(address payable _to) public payable {
// 自毁时将所有的 `msg.value` 重定向到 `to`
selfdestruct(_to);
}
}
  • 部署Exploiter合约, 构造器默认将Expoliter合约的余额转给 _to 地址

3. 解题

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

  • 3.2 部署攻击合约,并在部署时填入关卡实例地址

  • image-20230224171939607

  • 3.3 调用Deploy() 函数

  • image-20230224172152164

  • 3.4 调用实例部署的合约查看合约余额,结果 balance > 0

  • image-20230224172416999

  • 3.5 提交案例,并查看返回结果

  • image-20230224172833986

  • 3.6 成功!!!!

评论



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