1. 문제

외계인 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;
    }
}

2. Ownable contract 살펴보기

https://github.com/OpenZeppelin/ethernaut/blob/master/contracts/src/helpers/Ownable-05.sol

3. Owner 의 storage 위치 찾기

우리의 목표는 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 의 주소가 기록되어 있다