Ethernaut: 8. 금고

Play the level

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Vault {
  bool public locked;
  bytes32 private password;

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

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


여기서 우리는 황금률을 기억합니다: 블록체인의 모든 것은 모든 사람이 볼 수 있도록 거기에 있으며 항상 거기에 있을 것입니다. 이로써 계약서 작성에 사용된 비밀번호를 알 수 있습니다. 실제로 두 가지 방법이 있습니다.

컨트랙트 생성 트랜잭션을 보고 비밀번호 찾기: 컨트랙트 생성 코드는 컨트랙트 ABI 인코딩과 파라미터로 구성되어 있습니다. 따라서 마지막에 표시되는 일부 숫자는 constructor 인수입니다. 하나의 인수만 있다는 것을 알고 있습니다: 암호(32바이트). 16진수로는 64자이므로 계약 생성 코드의 마지막 64자를 확인할 수 있으며 이것이 비밀번호입니다. unlock 함수를 호출하는 동안 문자열 시작 부분에 0x를 추가해야 합니다.

저장소 변수를 보고 암호 찾기: Vault 계약을 보면 저장소를 위에서 아래로 읽습니다. EVM에는 각각 32바이트 값이 저장된 2 ^ 256}개의 슬롯이 있습니다. 맨 위에는 bool public locked가 있고 그 다음에는 bytes32 private password;가 있습니다. 이 변수는 스토리지에서 각각 인덱스 0과 1에 있습니다. 따라서 다음을 통해 비밀번호를 읽을 수 있습니다.

await web3.eth.getStorageAt(contract.address, 1)

contract.unlock(...)에 매개변수로 결과를 제공하기만 하면 됩니다.

좋은 웹페이지 즐겨찾기