외계인 contract 탈취 ㄱㄱ
// SPDX-License-Identifier: MIT
pragma solidity ^0.5.0;
import "../helpers/Ownable-05.sol";
contract AlienCodex is Ownable {
bool public contact;
bytes32[] public codex;
modifier contacted() {
assert(contact);
_;
}
function makeContact() public {
contact = true;
}
function record(bytes32 _content) public contacted {
codex.push(_content);
}
function retract() public contacted {
codex.length--;
}
function revise(uint256 i, bytes32 _content) public contacted {
codex[i] = _content;
}
}
https://github.com/OpenZeppelin/ethernaut/blob/master/contracts/src/helpers/Ownable-05.sol
우리의 목표는 AlienCodex contract 의 권한을 탈취하는 것이다.
하지만 AlienCodex contract 내부에는 Owner 변수를 가지고 있지 않다. 따라서 상속 받은 Ownable contract 를 살펴보면 Owner 변수가 존재한다
contract AlienCodex is Ownable { ... }
contract Ownable {
address private _owner;
...
}
AlienCodex의 slot 에는 아래와 같은 값들이 저장되어있고 owner 값은 slot[0] 에 존재한다
실제 cast storage 를 이용해 slot[0] 를 살펴보면 owner 의 주소가 기록되어 있다