> For the complete documentation index, see [llms.txt](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/ethernaut/0.-hello-ether.md).

# 0. Hello Ether

### **목표**

> 브라우저 콘솔을 이용하여 스마트 컨트랙트와 상호작용하여 기본적인  ethernaut 문제 풀이 방식을 익혀본다.

### 들어가기 전에

1. **메타 마스크 & ethernaut 연결**

<figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FiDuhXkWPT8rkcJ2dfUfh%2Fimage.png?alt=media&amp;token=0acbb38c-70c1-40c8-a192-219259f069cc" alt=""><figcaption></figcaption></figure>

* [ethernaut 메타마스크 상호작용](/smartcontract-security-docs/basics/5.-metamask/metamask-ethernaut.md) 참고하여 메타마스크와 ethernaut 연결을 해준다.

2. **브라우저 콘솔**

<figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fz3KXEPc69BvOuQnxIq4s%2Fimage.png?alt=media&amp;token=bbcd9c75-68ab-4a66-ad54-dd4945f715fd" alt=""><figcaption></figcaption></figure>

* F12 혹은 개발자 도구 → 콘솔을 눌러 브라우저 콘솔을 열어준다.

3. **helper functions**

<figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FUM43fzDjXLZnSOjD18C1%2Fimage.png?alt=media&amp;token=041fbe96-47f5-4aba-837d-139323d8c5ef" alt=""><figcaption></figcaption></figure>

* help()를 이용하여 사용할 수 있는 helper functions 목록을 확인할 수 있다.

4. **helper functions 활용**

\[1] player

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FKTuleUwl5xsXuPL5mtpo%2Fimage.png?alt=media&amp;token=162d57e1-7d3c-4127-b380-dfe8bf5f82fb" alt=""><figcaption></figcaption></figure></div>

* player를 이용하여 풀이자의 지갑 주소를 확인할 수가 있다.

\[2] getBalance(player)

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fw3TOyLm15iH9aIIPcnZG%2Fimage.png?alt=media&amp;token=ec69fe68-aade-43c4-837c-ab1c6b742694" alt=""><figcaption></figcaption></figure></div>

* getBalance(player)는 현재 이더 잔액을 확인할 수가 있다. await을 이용하여 확인하고자 하는 값을 바로 확인할 수가 있다.

\[3] owner

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fph1HLGPrJdRiRYbrEhtS%2Fimage.png?alt=media&amp;token=2dcd5046-8094-4a5f-acf7-81b6f490396d" alt=""><figcaption></figcaption></figure></div>

* ethernaut.owner()는 컨트랙트의 소유자를 알 수가 있다.

\[4] contract & info()

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fs7Y1tYu40K7ogTrDuxyO%2Fimage.png?alt=media&amp;token=82e78bb8-c444-4fdf-bf57-4b7271f75e51" alt=""><figcaption></figcaption></figure></div>

* awiat contract.info()를 통해 현재 레벨 컨트랙트의 인스턴스를 public view 함수인 info()로 문자열을 읽어 줄 수 있다.

***

### &#x20;공격 시나리오

```solidity
await contract.info()
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2F49EwjM3TweQn9pfqEdEK%2Fimage.png?alt=media&amp;token=7a4dc78f-c430-4bab-9a31-9f1e5db11a9b" alt=""><figcaption></figcaption></figure></div>

* 문제 설명 9번째를 보면 레벨 정보 메서드인 contract.info()를 보라고 되어 있고 입력 해주면 info1()이 필요하다는 내용이 출력 된다.

```solidity
await contract.info1()
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FxCqcRSfGID84QWXktLZB%2Fimage.png?alt=media&amp;token=a3670cd8-adc1-40ae-93a9-9b496d7c11a7" alt=""><figcaption></figcaption></figure></div>

* await contract.info1()을 입력하면 info2()를 시도 하되 hello를 파라미터로 줘야 한다는 내용이 출력 된다.

```solidity
await contract.info2("hello")
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fy98FmGPfLCBRfZw2bQGt%2Fimage.png?alt=media&amp;token=bb31e6d5-b3b9-4a54-b364-41ad5c04d733" alt=""><figcaption></figcaption></figure></div>

* await contract.info2("hello")를 입력하면 infonum이 다음 수행 메서드를 가지고 있다고 되어 있다.

```solidity
await contract.infoNum()
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2F61JSjBfRX7YLDVZzazzU%2Fimage.png?alt=media&amp;token=96dd27e8-5473-4c27-b51d-4324e75c41b5" alt=""><figcaption></figcaption></figure></div>

* await contract.infoNum()을 입력하면 word 배열값에 42라는 숫자가 있다.

```solidity
await contract.info42()
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FNxUj7DQzLhqoctP2FCVa%2Fimage.png?alt=media&amp;token=c4419076-aabb-48c3-aa44-8ff680ce2ba2" alt=""><figcaption></figcaption></figure></div>

* await contract.info42()를 입력하면 theMethodName을 이용해야 한다는 것을 알 수 있다.

```solidity
await contract.theMethodName()
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fzdp7YaQT33859hqKgMbK%2Fimage.png?alt=media&amp;token=6bf0fd07-ab77-44b3-8a93-73ed6958b7fc" alt=""><figcaption></figcaption></figure></div>

* await contract.theMethoName()을 입력하면 method name이 method7123949라는 출력이 나온다.

```solidity
await contract.method7123949()
```

<figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2Fd7YRRHz7Na4QBHfHMOys%2Fimage.png?alt=media&amp;token=267b2791-9c6b-4dc4-a5aa-8bb4408c7767" alt=""><figcaption></figcaption></figure>

* await contract.method7123949를 입력하면 password를 알고 있으면 authenticate에 넣으라는 내용이 있다.

```solidity
await contract.password
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FotLHiwINQ1FUK87qPSWR%2Fimage.png?alt=media&amp;token=e1c7e75a-31a0-4178-9426-da770d181dd6" alt=""><figcaption></figcaption></figure></div>

* await contract.password를 입력하면 password인 ethernaut0가 나온다.

```solidity
await contract.authenticate("ethernaut0")
```

<div align="left"><figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FzRuURobJAOh9UPONUEz4%2Fimage.png?alt=media&amp;token=2b7d01ec-2479-46af-80c7-46f73b3235cb" alt=""><figcaption></figcaption></figure></div>

* authenticate에 password인 ethernaut0를 넣어주고 컨펌 하면 문제가 해결된다.

<figure><img src="https://3512650551-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvLae9iTcYKyLdHhMtRVd%2Fuploads%2FojzaELxt3yISlXodJBdI%2Fimage.png?alt=media&amp;token=f56bdfe1-7c77-4eec-bde1-1aa7f2f0c18b" alt=""><figcaption></figcaption></figure>
