본문 바로가기
Write Up/Ethernaut - 블록체인 워게임

Ethernaut - 5단계 (Token)

by p6rkdoye0n 2023. 11. 7.
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Token {

  mapping(address => uint) 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[_to] += _value;
    return true;
  }

  function balanceOf(address _owner) public view returns (uint balance) {
    return balances[_owner];
  }
}

 

The goal of this level is for you to hack the basic token contract below.

You are given 20 tokens to start with and you will beat the level if you somehow manage to get your hands on any additional tokens. Preferably a very large amount of tokens.

  Things that might help:

What is an odometer?

 

이더넛 5단계 문제이다. 해당 문제는 기본으로 코인을 20개를 주고 나의 코인을 20개보다 더 많이 만들면 풀 수 있는 문제이다.

 

 

그렇지만 아무리 코드를 봐도 나의 코인을 뺄 수 있는 함수 (transfer) 만 있을 뿐, 나의 코인을 더하는 벡터는 존재하지 않기 때문에 빼는 과정에서 underflow 벡터를 의심해봐야한다.

 

function transfer(address _to, uint _value) public returns (bool) {
    require(balances[msg.sender] - _value >= 0);
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    return true;
  }

 

 

나의 토큰은 20 이므로 _value에 21을 입력하면

 

20 - 21 = -1 => uint (부호없는 정수) 이므로 underflow 발생

 

 

await contract.transfer(instance, 21)

 

위의 페이로드를 입력하면 언더플로우가 발생하여 엄청 큰 값의 토큰을 얻을 수 있을 것이다.

 

 

최종적으로 문제를 풀게 되었다.

 

🚩

'Write Up > Ethernaut - 블록체인 워게임' 카테고리의 다른 글

Ethernaut - 7단계 (Force)  (0) 2023.11.07
Ethernaut - 6단계 (Delegation)  (0) 2023.11.07
Ethernaut - 4단계 (Telephone)  (0) 2023.11.07
Ethernaut - 3단계 (Coin Flip)  (0) 2023.11.07
Ethernaut - 2단계 (Fallout)  (0) 2023.11.06