create account

[Ethereum] Ethernaut 소개 by modolee

View this thread on: hive.blogpeakd.comecency.com
· @modolee ·
$0.30
[Ethereum] Ethernaut 소개
https://steemitimages.com/DQmWQDjyP5d1RNW3mkCWUkDQ6yh3uDJFUZErPpaKBwKi4gM/iron_modolee.png

안녕하세요. 개발자 모도리입니다. 
오늘은 게임처럼 Ethereum Smart Contract의 취약점을 배울 수 있는 Ethernaut에 대해서 알아보겠습니다.
[OpenZeppeline](https://github.com/OpenZeppelin/openzeppelin-solidity)과 Smart Contract Auditing으로 유명한 [Zeppeline team](https://zeppelin.solutions/)에서 제공하고 있는 서비스입니다. 총 15단계로 이뤄져 있고, 각 단계마다 취약점 미션 풀이를 위해 필요한 취약점을 찾아야 합니다. 
예전에 대학생 때 보안 공부를 해 보겠다며, [해커스쿨](http://www.hackerschool.org)에서 이 외 비슷한 것을 이용해서 공부했던 기억이 납니다. 
저도 이제 막 시작해 본 단계라서 앞으로 문제 풀이를 꾸준히 올릴 예정입니다.

# The Ethernaut
홈페이지 주소
https://ethernaut.zeppelin.solutions/
접속하면 아래와 같은 화면이 나옵니다.
![01_intro.png](https://cdn.steemitimages.com/DQmYcArjDTscyoJwy74gBuDvp5ECAJfVWv41TkkKScpDCzt/01_intro.png)

Ethernaut는 Web3/Solidity 기반의 wargame(가상 전쟁게임)으로 [overthewire.org](https://overthewire.org/)와 만화 [El Eternauta](https://en.wikipedia.org/wiki/The_Eternaut)에서 영감을 받아서 만들어졌다고 합니다. EVM 안에서 동작하며, 각 level들은 smart contract로 구성 된 문제를 풀어야 넘어갈 수 있습니다.

그러면 아래의 ***Play now!*** 버튼을 눌러서 시작해 봅니다.

# 0.Hello Ethernaut
이 단계는 Ethernaut 문제를 풀기 위한 기본 준비 단계입니다.

### MetaMask를 설치합니다.
  * MetaMask 설치에 대해 잘 설명 된 글들이 많기 때문에 이 부분은 생략하겠습니다.
  * [이 글](https://medium.com/@weekly.teckle/%EB%A9%94%ED%83%80%EB%A7%88%EC%8A%A4%ED%81%AC-e7392e34c0be)을 참고 하시면 쉽게 따라하실 수 있습니다. (해당 글에서 *Ganache-CLI* 설정 부분 전까지만 따라하시면 됩니다.)
  * 네트워크는 **Main Ethereum Network**가 아닌 **Ropsten Test Network**를 선택해 주세요.
  *  ![02_metamask_ropsten.png](https://cdn.steemitimages.com/DQmcus7MHYv9CWgyRVmHBA7E879MTdv1pyGgxBZdvdWvLKy/02_metamask_ropsten.png)

### 브라우저의 콘솔 창을 열어주세요.
  * Chrome 기준으로 도구 메뉴 > 도구 더 보기 > 개발자 도구 또는 F12
  *  ![03_browser_console.png](https://cdn.steemitimages.com/DQmQfvRvVtTa7caphXRZjZPwXjZSZHkyKbAe8Vs2PxTFpqh/03_browser_console.png)
  * 콘솔창에 아래와 같은 메세지가 나오면 정상적으로 동작하고 있는 것입니다.
  * 그리고 콘솔창의 위치를 변경하고 싶으시면 빨간색으로 표시된 버튼을 눌러서 브라우저의 상,하,좌,우에 위치시킬 수 있습니다. 저는 오른쪽에 두는 것이 편해서 그렇게 설정해 놨습니다.
  *  ![04_browser_console_2.png](https://cdn.steemitimages.com/DQmNwvqdzBX2zKBepGuFmHCaQ8XMDFb5YXxy7idnKzD9x6G/04_browser_console_2.png)
  * 이 상태에서 콘솔에 `player` 라고 입력하면, 아래 처럼 MetaMask에서 생성한 지갑 주소가 출력됩니다.
  *  ![05_cmd_player.png](https://cdn.steemitimages.com/DQmTrLwttJXmst42nEHotCsAX74haXTQXbbaTC3dwrqbRz2/05_cmd_player.png)
### 콘솔의 helper를 사용해 봅니다.
  * 현재 ether balance를 확인할 수 있는 명령어 입니다.
  * ` getBalance(player) `
  * 위의 명령어를 입력했을 때 **Promise {< pending >}**과 같은 메세지가 나온다면 해당 메세지를 펼쳐 보면 원하는 값이 나오긴 합니다. 하지만 보다 깔끔한 값 확인을 위해선 명령어 앞에 `await`을 붙여서 실행해야 합니다.
  * ![06_cmd_getbalance.png](https://cdn.steemitimages.com/DQmR8DyqLnChSekdRpoCMG8ftwoWge5bU8mNPe8cd73VTNm/06_cmd_getbalance.png)
  * `help()` 명령어는 게임 플레이시 사용 될 유용한 명령어들을 알려줍니다.
  * ![07_cmd_help.png](https://cdn.steemitimages.com/DQmT228DYEQGWBvYMb5ZYAyvtbdxZgnsDgB9gQaAwo6bkfe/07_cmd_help.png)
### The ethernaut contract
  * `ethernaut` 명령을 통해서 Ropsten Test Network에 올라가 있는 ethernaut의 contract를 확인할 수 있습니다.
  * 레벨 클리어 정보 등을 담고 있을 것 같은데, 이 게임을 진행할 때 콘솔을 통해서 직접적으로 사용하진 않습니다. 버튼 등을 통해서 호출하게 됩니다.
  * ![08_cmd_ethernaut.png](https://cdn.steemitimages.com/DQmY9PNdmy91k3jv2RARyFjZYn2aMrK4idhvsAL1vtRw4Ps/08_cmd_ethernaut.png)
### ABI를 통해서 정보를 주고 받습니다.
  * Ethernaut는 Ethernaut.sol을 포함하고 있는 TruffleContract입니다.
  * Web3를 이용해서 Smart Contract와 상호작용을 하려면 ABI가 필요합니다.
  * Ethernaut의 ABI는 Ethernaut.sol의 public method에 접급할 수 있게 해줍니다.
  * `owner` 명령어가 그 중 하나입니다.
  * ![09_cmd_owner.png](https://cdn.steemitimages.com/DQmR9LbwrZ195xnmPd9PpzLdXNpZ2gQV9GN8rSY3GdqX6VC/09_cmd_owner.png)
### Test ether를 받아 봅니다.
  * Test network에서 작업을 하지만, 그래도 transaction을 일으킬 때 gas fee가 필요합니다.
  * 그래서 https://faucet.metamask.io/ 에 접속해서 **request 1 ether from faucet** 버튼을 누르면 잠시 후에 test용 ether가 MetaMask 지갑으로 들어옵니다.
  * ![10_test_ether.png](https://cdn.steemitimages.com/DQmVyCKFNG2G8frbPX7qqReWSViEcG7UbfLkhinsDfMcH7Y/10_test_ether.png)
### Level instance를 생성합니다.
  * Level을 플레이할 때 마다 새로운 level instance를 생성해서 해당 instance를 통해서 문제를 푸는 방식입니다.
  * 맨 아래에 **Get new instance**를 눌러보세요.
  * MetaMask 창에 Gas Limit, Gas Price를 넣는 곳과 버튼 3개(RESET, SUBMIT, REJECT)가 있습니다.
  * 우리는 test ether가 있으니 Gas price를 넉넉하게 5 Gwei 정도 주고 SUBMIT 버튼을 누릅니다.
  * ![11_metamask_submit.png](https://cdn.steemitimages.com/DQmf4U2b6RuURwm89K3fvqs2mkdaxu2FtPxgN78caabBj6E/11_metamask_submit.png)
  * 그러면 콘솔에 **Sent transaction** 메세지가 뜨고, 잠시 기다리면 **Mined transaction** 이라는 메세지가 추가로 뜹니다.
  * 금방 우리가 submit을 누른 순간 Ropsten test network에 contract를 배포한 것입니다.
  * **Instance address**라고 나오는 것이 배포 된 contract의 주소입니다.
  * ![12_new_instance.png](https://cdn.steemitimages.com/DQmUE6xrkbKfSTDDbBHwSQ3Fd2FwRYwwezqZpd2vJhZ4sZp/12_new_instance.png)
### Level contract를 확인합니다.
  * 아까 `ethernaut` 명령을 통해서 contract를 확인한 것 처럼, 방금 우리가 배포한 contract는 `contract` 명령을 통해서 확인할 수 있습니다.
  * 펼쳐서 보면 abi라는 것이 있는데, 그것을 펼치면 호출할 수 있는 public method를 확인할 수 있습니다.
  * ![13_contract.png](https://cdn.steemitimages.com/DQmQPQjvifWm6zcAPxSRdHGeMq9975weeTT7REQE1y889kF/13_contract.png)
### contract와 메세지를 주고 받으며 Level 임수를 완수합니다.
  * `await contract.info()` 명령을 입력하면 이번 level의 임수 완수를 위한 힌트가 나옵니다.
  * 힌트를 따라서 명령어를 입력하다 보면 임수를 완수하게 되고, 모든 임수 완수 후엔 맨 아래 **Submit instance** 버튼을 눌러서 임수 완수 트랜잭션을 기록하면 다음 level로 넘어갈 수 있습니다.

오늘은 우선 문제를 풀이 위한 기본 준비 작업을 마쳤습니다. 앞으로 한 문제 한 문제씩 풀어가며 포스팅을 할 예정입니다. 혹시나 직접 풀고 싶으신 분들께는 스포가 될 수 있으니, 앞으로 ethernaut 문제 풀이 편은 읽지 않는 편이 좋으실 것 같습니다.^^;; 앞으로 열심히 한번 풀어 보겠습니다!!
👍  , , , , ,
properties (23)
authormodolee
permlinkethereum-ethernaut
categorykr-dev
json_metadata{"tags":["kr-dev","kr","ethereum","ethernaut"],"image":["https://steemitimages.com/DQmWQDjyP5d1RNW3mkCWUkDQ6yh3uDJFUZErPpaKBwKi4gM/iron_modolee.png","https://cdn.steemitimages.com/DQmYcArjDTscyoJwy74gBuDvp5ECAJfVWv41TkkKScpDCzt/01_intro.png","https://cdn.steemitimages.com/DQmcus7MHYv9CWgyRVmHBA7E879MTdv1pyGgxBZdvdWvLKy/02_metamask_ropsten.png","https://cdn.steemitimages.com/DQmQfvRvVtTa7caphXRZjZPwXjZSZHkyKbAe8Vs2PxTFpqh/03_browser_console.png","https://cdn.steemitimages.com/DQmNwvqdzBX2zKBepGuFmHCaQ8XMDFb5YXxy7idnKzD9x6G/04_browser_console_2.png","https://cdn.steemitimages.com/DQmTrLwttJXmst42nEHotCsAX74haXTQXbbaTC3dwrqbRz2/05_cmd_player.png","https://cdn.steemitimages.com/DQmR8DyqLnChSekdRpoCMG8ftwoWge5bU8mNPe8cd73VTNm/06_cmd_getbalance.png","https://cdn.steemitimages.com/DQmT228DYEQGWBvYMb5ZYAyvtbdxZgnsDgB9gQaAwo6bkfe/07_cmd_help.png","https://cdn.steemitimages.com/DQmY9PNdmy91k3jv2RARyFjZYn2aMrK4idhvsAL1vtRw4Ps/08_cmd_ethernaut.png","https://cdn.steemitimages.com/DQmR9LbwrZ195xnmPd9PpzLdXNpZ2gQV9GN8rSY3GdqX6VC/09_cmd_owner.png","https://cdn.steemitimages.com/DQmVyCKFNG2G8frbPX7qqReWSViEcG7UbfLkhinsDfMcH7Y/10_test_ether.png","https://cdn.steemitimages.com/DQmf4U2b6RuURwm89K3fvqs2mkdaxu2FtPxgN78caabBj6E/11_metamask_submit.png","https://cdn.steemitimages.com/DQmUE6xrkbKfSTDDbBHwSQ3Fd2FwRYwwezqZpd2vJhZ4sZp/12_new_instance.png","https://cdn.steemitimages.com/DQmQPQjvifWm6zcAPxSRdHGeMq9975weeTT7REQE1y889kF/13_contract.png"],"links":["https://github.com/OpenZeppelin/openzeppelin-solidity","https://zeppelin.solutions/","http://www.hackerschool.org","https://ethernaut.zeppelin.solutions/","https://overthewire.org/","https://en.wikipedia.org/wiki/The_Eternaut","https://medium.com/@weekly.teckle/%EB%A9%94%ED%83%80%EB%A7%88%EC%8A%A4%ED%81%AC-e7392e34c0be","https://faucet.metamask.io/"],"app":"steemit/0.1","format":"markdown"}
created2018-06-16 16:33:24
last_update2018-06-16 16:33:24
depth0
children0
last_payout2018-06-23 16:33:24
cashout_time1969-12-31 23:59:59
total_payout_value0.242 HBD
curator_payout_value0.056 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length5,243
author_reputation285,192,678,959
root_title"[Ethereum] Ethernaut 소개"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id60,997,658
net_rshares121,161,620,781
author_curate_reward""
vote details (6)