 안녕하세요. 개발자 모도리입니다. Ethernaut 문제 풀이 시리즈를 계속 진행해 보려고 합니다. 이번에는 Level 2 문제를 풀어보겠습니다. 지난 게시물은 아래를 확인해 주세요. * [Ethernaut 소개](https://steemit.com/kr-dev/@modolee/ethereum-ethernaut) * [Ethernaut 풀이 - 0.Hello Ethenaut](https://steemit.com/kr-dev/@modolee/ethereum-ethernaut-0-hello-ethenaut) * [Ethernaut 풀이 - 1.Fallback](https://steemit.com/kr-dev/@modolee/ethereum-ethernaut-1-fallback) --- # 2. Fallout ## 임무 확인 & 새로운 인스턴스 생성 Level 1 보다 쉬워 보입니다. 그냥 ownership만 가져오면 됩니다.  **Get new instance** 버튼을 눌러서 인스턴스를 생성합니다.  ## Solidity 코드 분석  * ownership을 가져오려면 owner를 변경하는 부분을 찾아야 합니다. * 생성자 부분에만 owner를 설정하는 부분이 있고, 나머지 코드에는 어디에도 owner를 설정하는 부분이 없습니다. * 생성자는 컨트랙트를 최초 배포하는 Level 컨트랙트가 부를텐데, 어떻게 해야 되는걸까요?? (이미 이상한 부분은 찾으신 분들도 계시겠지만... 잠시만 기다려 주세요 ㅋㅋ) * 현재 owner를 확인해 보면 역시나 Level 컨트랙트가 owner로 설정되어 있습니다.  ## Remix 이용하기 * 임무 확인 시 Solidity Remix IDE를 쓰면 도움이 될 거라는 문구를 봤습니다. 그러면 Remix에 소스 코드를 붙여 넣고 확인해 보겠습니다. * 그 전에 Remix가 익숙하지 않으신 분들은 [이 글](https://medium.com/@weekly.teckle/remix-solidity-ide-d16af87e597f)을 읽어 보시면 쉽게 사용하실 수 있습니다. * 우리는 MetaMask를 사용하고 있으므로 Run 탭의 Environment를 Injected Web3를 선택합니다.  * 그리고 Remix 우측 상단의 + 버튼을 눌러서 새로운 파일을 만들고 Level 2 소스 코드를 전체 복사해서 붙여 넣습니다. * Complie 탭으로 가서 **Auto compile** 옵션을 선택합니다.  * 그러면 **Unable to import "zeppelin-solidity/contracts/ownership/Ownable.sol": File not found** 라는 에러 메세지가 나옵니다.  * 해당 메세지가 나오는 이유는 방금 우리가 붙여 넣은 소스는 truffle framework를 이용해서 작성 된 코드로 로컬에 Ownable.sol 파일을 가지고 있으면서 컴파일 시 사용하던 코드입니다. 그런데 Remix에선 해당 파일을 불러올 수 없으니 직접 코드를 붙여 넣어줘야 합니다. 해당 코드는 [openzeppeline](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol)에서 가지고 오겠습니다. * import 코드를 지워주고  * 그 자리에 pragma를 제외한 나머지 ownable 코드를 붙여 넣습니다.  * 아직 warning 메세지가 남아 있습니다.  * `this.balance` 코드에서 this를 address 타입으로 명시적 형변환을 해줘야 합니다.  * 이제 컴파일이 무사히 됐습니다. Run탭으로 넘가면 컨트랙트를 Deploy할 수 있는 환경이 구축되었습니다. * 하지만 우리는 직접 컨트랙트를 배포하는 것이 아니라 Level 컨트랙트가 배포해 놓은 컨트랙트를 불러서 사용해야 됩니다. (그래야 해당 컨트랙트의 상태가 변경되어 임무를 완수할 수 있으니깐요) * 콘솔에서 Instance address를 확인합니다.  * 해당 주소를 복사해서 Remix의 **Load contract from Address** 창에 붙여 넣고 At Address 버튼을 눌러주면 해당 컨트랙트를 불러옵니다.  * 뭔가 이상한 함수가 하나 있습니다. (Fallout 인줄 알았는데, Fal1out 이었네요... 낚였습니다.)  * 정상적인 생성자였다면 함수 목록에 표시되지 않습니다. Level 1 컨트랙트를 살펴 보시죠. (Fallback이라는 이름의 함수는 없습니다. (fallback)은 다른 함수 입니다.)  ## 문제 풀이 * 트릭을 발견했으니, 문제는 굉장히 간단해 졌습니다. 그냥 Fal1out을 호출하면 owner가 될 수 있습니다. * 호출하고 owner를 확인해 보겠습니다. * Remix에서 확인  * Console에서 확인  ## 답안 제출 * **Submit instance** 버튼을 누릅니다.  * 임무를 완수했습니다.  ## 말하고자 하는 취약점 * Fallout은 Fal1out으로 잘못 쓰는 사소한 실수로 인해 컨트랙트의 ownership을 아무나 획득할 수 있게 되었습니다. * 이런 경우가 종종 발생하여 Solidity 0.4.23 버전부터는 컨트랙트와 동일한 이름으로 생성자를 만드는 대신 constructor라는 별도의 이름으로 선언하게 업데이트 되었습니다. * 취약점을 개선한 버전이 지속적으로 나오는 만큼, 컨트랙트 작성 시 최대한 최신 버전에 맞춰서 컨트랙트를 작성하는게 좋지 않을까 생각합니다. * 그리고 역시 auditing이 필요하다~ 가 결론일 것 같네요.^^ 오늘은 이것으로 마치겠습니다. 감사합니다.
author | modolee |
---|---|
permlink | ethereum-ethernaut-2-fallout |
category | kr-dev |
json_metadata | {"tags":["kr-dev","kr","ethereum","solidity","ethernaut"],"image":["https://steemitimages.com/DQmWQDjyP5d1RNW3mkCWUkDQ6yh3uDJFUZErPpaKBwKi4gM/iron_modolee.png","https://cdn.steemitimages.com/DQmeqQCqhiWUtKtEMCNzv66hQn4nt3Ng3cS1vmTPj21F4SQ/00_mission.png","https://cdn.steemitimages.com/DQmYKV4BmFZKmCPL3N5nijZgMJCDN8ZAzFc8nzUtQAriyiZ/00_2_get_new_instance.png","https://cdn.steemitimages.com/DQmSwHqzZDmRiV3nRcKwmqWcNNdVgR2TSqcNueTDgQfhNcU/00_3_code_all.png","https://cdn.steemitimages.com/DQmWofyKP5arRF9EjPA82scj572kM16bv3VM9eASM4nb6u3/00_4_owner.png","https://cdn.steemitimages.com/DQmXcrm3VWyDh8qhQvTzsbWbTpKgKAEGd7ehNNM5xnpitZK/00_5_remix_metamask.png","https://steemitimages.com/0x0/https://cdn.steemitimages.com/DQmSFpT8NjZTvw8vJ6x55i1jdNrtso1G5SpFEmyywmK44Bw/05_auto_compile.png","https://cdn.steemitimages.com/DQmYY3TPWp3SiW8fAE2eFitybru2eEntnoraTS4VdzdDY5y/01_ownable_not_found.png","https://cdn.steemitimages.com/DQmUNSh3oWDCBfkFcHygXrh5Sx4EdRq7rXLkTtuJsxbF3kk/01_1_delete_import.png","https://cdn.steemitimages.com/DQmSfou83puYSWCygHvAaNi1BpVSb56LSP6uQRwerX6QFoo/01_2_paste_ownable.png","https://cdn.steemitimages.com/DQmZ5X6HdfyiRQSLhjWnGrFC1cox8VqdMLPw36iz1gAprsM/02_balance_casting_warn.png","https://cdn.steemitimages.com/DQmTbKHXND3jeB26C8KEwznchxLEnwLLfHeWDEvuADV3sdN/03_balance_casting_sol.png","https://cdn.steemitimages.com/DQmSW8FztV9pqvXECooeoVewBEMp9KNXCq9E9G5xVLYxtAw/04_instance_address.png","https://cdn.steemitimages.com/DQmapBFiUwAoaC7jeCUZgk4R5u4KwAy8wC2hqQTobgLgjBy/05_at_address.png","https://cdn.steemitimages.com/DQmaJH7cjKHhBs2BnR43ZiaLupKiHbh3qtZ1mF8SN78RtqJ/06_fal1out.png","https://cdn.steemitimages.com/DQmTm3D8K8Xi4hii6NLLHUGK3Qw9nkUH5DecLzeMuvZnXqV/07_normal_contructor.png","https://cdn.steemitimages.com/DQmd9j2LY8emnfSYbbTC88zsniu2zuPMy91tt9vmBoxLdKG/08_owner.png","https://cdn.steemitimages.com/DQmaA7sCgWxFHbFpTTixQ8XzJP24PzTwLrtRi3AyrTPjGRR/09_console_owner.png","https://steemitimages.com/0x0/https://cdn.steemitimages.com/DQme3DtJ5HWZD8KAeDQ3hpWwoWJi5XGK7KQAvSzzhGDrZrQ/16_submit_instance.png","https://cdn.steemitimages.com/DQmNRPoXeg43tHhCssquqSskA5oymBspjE4wKrQkTUDdBYd/10_complete.png"],"links":["https://steemit.com/kr-dev/@modolee/ethereum-ethernaut","https://steemit.com/kr-dev/@modolee/ethereum-ethernaut-0-hello-ethenaut","https://steemit.com/kr-dev/@modolee/ethereum-ethernaut-1-fallback","https://medium.com/@weekly.teckle/remix-solidity-ide-d16af87e597f","https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol"],"app":"steemit/0.1","format":"markdown"} |
created | 2018-06-20 01:35:27 |
last_update | 2018-06-20 01:35:27 |
depth | 0 |
children | 1 |
last_payout | 2018-06-27 01:35:27 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.099 HBD |
curator_payout_value | 0.023 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 5,277 |
author_reputation | 285,192,678,959 |
root_title | "[Ethereum] Ethernaut 풀이 - 2.Fallout" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 61,428,786 |
net_rshares | 59,467,229,643 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
samwicallis | 0 | 351,559,058 | 100% | ||
brainstormot | 0 | 31,949,591,857 | 100% | ||
mishana | 0 | 6,264,490,642 | 50% | ||
thetroublenotes | 0 | 80,943,701 | 0.3% | ||
osyvv | 0 | 19,112,259,023 | 100% | ||
hackerzizon | 0 | 716,592,518 | 10% | ||
chosk213 | 0 | 387,593,772 | 100% | ||
pangol | 0 | 604,199,072 | 100% |
Get a free Bible for your phone, tablet, and computer. [bible.com](http://bible.com)
author | bible.com |
---|---|
permlink | re-modolee-ethereum-ethernaut-2-fallout-20180620t013533140z |
category | kr-dev |
json_metadata | {"tags":["kr-dev"],"links":["http://bible.com"],"app":"steemit/0.1"} |
created | 2018-06-20 01:35:33 |
last_update | 2018-06-20 01:35:33 |
depth | 1 |
children | 0 |
last_payout | 2018-06-27 01:35:33 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 84 |
author_reputation | -3,064,160,201,856 |
root_title | "[Ethereum] Ethernaut 풀이 - 2.Fallout" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 61,428,796 |
net_rshares | 0 |