Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

Smart contract/Ethernaut 문제풀이

Ethernaut 문제풀이 #2 - Fallout

방피터 2022. 2. 28. 16:31

Fallout이라는 이름의 문제입니다. 오너십을 탈취하는 건데요. Solidity Remix IDE라는 솔리디티용 online ide가 도움이 될 거라고 나와 있습니다. 접속하면 아래와 같은 모습입니다.

마찬가지로  파란색 Get new instance 버튼을 눌러 인스턴스를 할당 받습니다.

6개의 ABI

컨트렉트에 6개의 ABI가 있구요. 음.. 오케이 그럼 일단 오너를 확인해봅시다.

await contract.owner()

오잉? 오너가 없습니다. 그렇다면 보통 오너를 생성자에서 지정하니 분명 생성자에 문제가 있겠네요. 살펴봅시다.

Fallout 생성자

생성자인데요. 음 저번 fallback과 비교해본다면 이전에는 constructor()를 사용해 생성자를 정의했고 이번 fallout은 자기 자신의 이름을 사용함으로써 생성자를 정의했네요. 그것 말고는 payable뿐이 없어요.

fallback 생성자

큰 차이를 모르겠습니다. Remix를 사용해보라고 했으니 Remix에 빈 파일 하나 만들어 복붙해봅시다.

뭐 경고나 그런거를 참고하라고 그럴 줄 알았는데 ㅋㅋㅋㅋㅋ Fallout 이 아니라 Fal1out이었네요.ㅋㅋㅋㅋㅋㅋ 대박 ㅋㅋ

 

그러니까 위에 저건 생성자가 아니라 일반 퍼블릭 함수네요. 당연히 생성자로써 실행된 적도 없을거고 ㅎㅎ 누구나 오너가 될 수 있는 컨트렉트가 되었습니다. 그럼 ㅋㅋㅋ 실행해봅시다.

await contract.owner();
await contract.fal1out();
await contract.owner();

fal1out() 실행 결과 - 오너가 자신으로 바뀌었다.

오너가 자신으로 바뀐 것을 확인하실 수 있습니다. ㅎㅎ 생성자에 오타라니 ㅋㅋ 하지만 우리도 이런 실수를 할 수 있으니 매우 조심해야겠습니다. 자 이제 그럼 주황색 버튼을 눌러 인스턴스를 제출하고 마무리하시죠.

언제나 못난 날 칭찬해주는 ㅠㅠ 고마워~

반드시 생성자는 constructor()를 사용하여 만들자!

 

로 오늘의 교훈을 정하겠습니다. 그럼 레벨 3에서 만나요~

 

안녕 ~!

반응형