새소식

인기 검색어

Write Up/Ethernaut

[Ethernaut] Hello Ethernaut

  • -
반응형

Ethernaut는 blockchain 해킹의 wargame이다.

기본적인 Language는 Solidity를 사용하고 있으며 ethereum에 기반하여 진행하고 있다.

blockchain 해킹은  code auditing도 해야 하지만 코드의 흐름이랑 VM과의 상호작용도 잘해야 한다고 생각한다.

처음부터 차근차근 진행해 보자!!

MetaMask는 Ethereum과 blockchain사이 상호작용을 하는 데 사용되는 소프트웨어 암호 화폐 지갑이다.

Goerili를 testnet으로 설정을 했다면 Get new instance를 통하여 instance를 만들어야 한다.

하지만 초기에 개발한 지갑에는 ether가 0으로 되어있을 것이다.

https://goerlifaucet.com/

위 주소를 클릭하고 나오는 창에 지갑의 주소를 넣고 Send Me ETH를 누르면 0.2 ETH를 받을 수 있다.

MetaMask를 설치하고 testnet으로 Goerli를 설정을 했다면 ethernaut를 개발자 도구를 통하여 여러 가지를 볼 수 있다.

console창을 열면 address가 구성되어 있는데 help()를 누르면 상호작용할 수 있는 함수 목록이 나온다.

그리고 4번부터 ABI랑 상호작용 하는 법, test ether 받는 법 level instance 만드는 법 등 ethernaut의 사용 방법이 나와 있다.

마지막 9번을 보면 level을 완료하기 위해서 contract에서 해야 하는 것을 완료하라고 나와 있다.

그럼 첫 번째부터 같이 해보도록 하자!!

 

처음에 await contract.info()를 입력하라고 나와 있다. 하지만 그전에 contract의 abi를 확인해 보자.

ABI를 통해서 호출할 수 있는 public method를 확인할 수 있다.

info1()에 내가 필요한 것이 있다고 나와 있다.

info2()를 호출하는데 hello라는 parameter를 넣어서 호출하라고 나와 있다.

다음 method로 가는 숫자가 infoNum의 속성에 있다고 나와 있다.

infoNum의 속성에 42라는 숫자가 나와있다.

theMethodName을 호출하라고 나와있다.

MethodName은 method7123949이다.

password를 알아내서 authenticate() 함수에 인자로 넣고 호출하라고 나와있다.

password() 함수를 호출하면 ethernaut0이라는 string이 나온다.

ethernaut0을 넣고 호출하면 ether를 지불하라고 나온다. 지불을 하면 Submit instance를 누르면 된다.

사진과 같은 창과 함께 level을 완료했다고 나온다. 그리고 level의 코드도 함께 출력되는 것을 확인할 수 있다.

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

contract Instance {

  string public password;
  uint8 public infoNum = 42;
  string public theMethodName = 'The method name is method7123949.';
  bool private cleared = false;

  // constructor
  constructor(string memory _password) {
    password = _password;
  }

  function info() public pure returns (string memory) {
    return 'You will find what you need in info1().';
  }

  function info1() public pure returns (string memory) {
    return 'Try info2(), but with "hello" as a parameter.';
  }

  function info2(string memory param) public pure returns (string memory) {
    if(keccak256(abi.encodePacked(param)) == keccak256(abi.encodePacked('hello'))) {
      return 'The property infoNum holds the number of the next info method to call.';
    }
    return 'Wrong parameter.';
  }

  function info42() public pure returns (string memory) {
    return 'theMethodName is the name of the next method.';
  }

  function method7123949() public pure returns (string memory) {
    return 'If you know the password, submit it to authenticate().';
  }

  function authenticate(string memory passkey) public {
    if(keccak256(abi.encodePacked(passkey)) == keccak256(abi.encodePacked(password))) {
      cleared = true;
    }
  }

  function getCleared() public view returns (bool) {
    return cleared;
  }
}

 

반응형

'Write Up > Ethernaut' 카테고리의 다른 글

[Ethernaut] Preservation  (0) 2023.02.01
[Ethernaut] Telephone  (0) 2023.01.30
[Ethernaut] CoinFlip  (0) 2023.01.30
[Ethernaut] Fallout  (0) 2023.01.29
[Ethernaut] Fallback  (0) 2023.01.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.