Don't think! Just do it!

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

Smart contract/Ethernaut 문제풀이

Ethernaut 문제풀이 #5 - Token

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

5번째 문제 Token입니다.

목표는 컨트렉트의 토큰을 해킹하는 것이구요.

20개의 토큰을 가지고 시작하는데요 20개보다 더 많은(매우 많이) 토큰을 확보하면 된다고 합니다.

힌트로는 "odometer가 뭔가요?" 음.... 주행계? 모르겠네요. 코드부터 봅시다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Token {

  mapping(address => uint) balances;//balances 변수
  uint public totalSupply;//총 공급 변수

  constructor(uint _initialSupply) public {
    balances[msg.sender] = totalSupply = _initialSupply;
    //초기 공급량은 컨트렉트 만든사람이 다 들고 있구요.
  }

  function transfer(address _to, uint _value) public returns (bool) {
    require(balances[msg.sender] - _value >= 0);//보낼 수량이 잔고보다 커야 하구요.
    balances[msg.sender] -= _value; //송신자 balances에서 빼서
    balances[_to] += _value;//수신자 balances에 더합니다.
    return true;
  }

  function balanceOf(address _owner) public view returns (uint balance) {
    return balances[_owner];//벨러스를 확인할 수 있는 함수네요.
  }
}

 

코드는 훑어 봤구요 자 인스턴스를 생성하고 이것저것 살펴봅시다.

 

일단 설명대로 제 계좌에는 토큰이 20개가 있네요.

 

 

이 토큰의 총 발행량은 21,000,000 개네요.

 

 

실행하지 않고 남은 ABI는 이제 생성자와 transfer입니다. 자 이제부터 생각해보자면 일단 다른 컨트렉트에서 보이던 safemath가 보이질 않습니다. safemath는 사실 오버플로우만 체크하는 굉장히 간단한 라이브러리이긴 합니다만 이것을 사용하지 않고 더하기 빼기하면 난리가 나는 것이죠. 자 일부러 오버플로우를 만들어 봅시다.

 

저는 20개 뿐이 없습니다만 오버플로우를 일으키기 위해 그보다 많은 21개를 저 자신에게 전송하도록 해보겠습니다.

await contract.transfer("0x216E0Ae475b49D564A6d25Acb336D48C82d62ACf",21);

의미 없어 보이는 엄청 큰 숫자들이 제 계좌에 있습니다. 전 이제 부자인건가요? ㅠㅠㅠ 네 아닙니다.

 

코드를 다시 한번 보시면서 생각해보시죠.

  function transfer(address _to, uint _value) public returns (bool) {
    require(balances[msg.sender] - _value >= 0);
    //20 - 21 = -1이 아니라 오버플로우 된 엄청 큰 양수가 되어 그냥 실행이 됩니다.
    balances[msg.sender] -= _value;
    //자신의 계좌에서 21을 빼서 엄청 큰 양수를 만듭니다.
    balances[_to] += _value;
    //또 자기 자신에게 21을 더합니다. 다시 반대쪽으로 오버플로우가나서 정상적으로 더해질 것 같지만 그렇지는 않네요.
    return true;
  }

계좌에 Array로 큰 숫자들이 들어가 있는데 어떻게 된 일일까요? 음.. (아시는 분은 설명좀 ㅎㅎㅎ)

 

몇 가지 의문이 남긴 하지만 일단 레벨의 요구대로 20개보다 엄청 많이 확보했으니까 칭찬 받으러 갑시다. 제출!

칭찬받았다 헤헤~

 

 

정답을 제출하고 나면 친절하게 설명을 해줍니다. 아래처럼요. 참고하시기 바랍니다.

 

이 레벨에서 얻을 수 있는 교훈은 명확하네요!

 

언제나 오버플로우 체크! 안하면 패가망신!

 

자 그럼 레벨 6에서 봅시다.

 

안녕~!

반응형