Pwnstar

Ethernaut Level 9(King) 본문

Wargame/Ethernaut

Ethernaut Level 9(King)

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

설명을 요약하자면 prize보다 큰 값의 ether를 전송하면 king이 될 수 있고, 이전의 왕은 이더를 받게 된다.

submit instance를 하면 레벨이 kingship을 돌려받을 건데, 이걸 우회하면 문제를 풀 수 있다고 한다.

코드

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

contract King {

  address king;
  uint public prize;
  address public owner;

  constructor() payable {
    owner = msg.sender;  
    king = msg.sender;
    prize = msg.value;
  }

  receive() external payable {
    require(msg.value >= prize || msg.sender == owner);
    payable(king).transfer(msg.value);
    king = msg.sender;
    prize = msg.value;
  }

  function _king() public view returns (address) {
    return king;
  }
}

설명 그대로의 코드다. 다만 prize는 king이 바뀔 때마다 계속해서 증가할듯.

그래서 우선 kingship을 탈취하고, submit을 진행해봤다.

그랬더니 kingship이 레벨의 address로 돌아왔다. 이걸 우회해야한다는 말인데 좀 이상한 점을 발견했는데, 문제풀이에 도움이 될 진 모르겠다.

새로 instance를 만들면 그때 prize는 0.001 ether로 설정되어 있다.

이때 0.001 ether를 전송하고 king을 내 지갑 주소로 만든 후

submit을 진행하면 king은 당연히 다시 level의 address로 돌아가는데, prize가 0으로 초기화된다.

그러면 이때부터는 ether를 전송하지 않고도 king을 바꿀 수 있다는 말인데, 여기서 또 하나의 의문이 생겼다.

submit을 했을 때, 내가 kingship을 획득할 때와 마찬가지로 level이 receive함수를 통해서 kingship을 다시 획득하는 거라면, prize는 적어도 내가 전송한 ether(0.001) 이상이어야할텐데, 어떻게 0으로 만드는 것일까?

어찌됐든 level address가 다시 kingship을 획득하기 위해서는 해당 컨트랙트를 통해 다시 이더를 보낼 것이고, payable(king).transfer(msg.value); 이 부분을 통해 아마 현재 king인 나의 address로 이더를 보내게 될 것이다.

그런데 만약 내가 이더를 받을 수 없는 상태라면 어떨까?

king을 내 지갑 주소가 아닌 ether를 받을 수 없는 contract의 주소로 설정할 수 있다면 transfer함수에서 에러가 발생하여 king을 바꾸지 않게 될 것이고, 문제를 풀 수 있지 않을까?

라는 생각이 들어서 컨트랙트를 작성해봤다.

pragma solidity ^0.8.0;

contract KingEx {
    function attack(address payable _to) public payable{
        (bool sent, ) = _to.call{value: msg.value}("");
        require(sent, "Failled" );

    }
}

이렇게 작성하고 0.001 ether를 전송해보았다.

king이 내가 deploy한 컨트랙트의 주소로 바뀐 것을 확인할 수 있었다.

그리고 submit을 진행했더니 내 예상대로 문제가 풀렸다.

이 문제도 사실 그리 어려운 것은 아니었는데, 푸는데 너무 오래 걸렸다.


Uploaded by N2T

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

Ethernaut Level 11(Elevator)  (0) 2023.04.05
Ethernaut Level 10(Re-entrancy)  (0) 2023.04.04
Ethernaut Level 8(Vault)  (0) 2023.04.03
Ethernaut Level 7(Force)  (0) 2023.04.03
Ethernaut Level 6(Delegation)  (0) 2023.04.03
Comments