위 주소를 클릭하고 나오는 창에 지갑의 주소를 넣고 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;
}
}