Pwnstar

Ethernaut Level 5(Token) 본문

Wargame/Ethernaut

Ethernaut Level 5(Token)

포너블처돌이 2023. 3. 12. 00:03

토큰 컨트랙트를 해킹하라고 한다.

20개의 토큰을 가지고 시작하는데, 가급적 많은 추가 토큰들을 획득하면 되는 것 같다.

odometer가 뭔지 알면 도움이 된다고한다.

  • odometer의 사전적 의미는 주행계라고 나와있는데, 자전거 또는 자동차가 주행한 마일 수를 기록하는 장치이다.

근데 이게 이더리움 플랫폼이나, solidity 언어에서 무엇을 의미하는 지는 찾지 못했다. 그래서 혹시 인공지능이 답을 알까 싶어 chatGPT에 물어봤는데,

음…. 뭐, 그렇다고 한다. 근데 얘가 항상 정확한 정보만 주는것도 아니기에 그냥 대충 보고 다시 구글링을 해봤는데, 도움이 될 만한 블로그를 발견했다.

How to Secure Your Smart Contracts: 6 Solidity Vulnerabilities and how to avoid them (Part 1)
In a previous post we discussed the future of Ethereum’s scalability by analyzing the concepts presented at Devcon3. Let’s take a moment…
https://medium.com/loom-network/how-to-secure-your-smart-contracts-6-solidity-vulnerabilities-and-how-to-avoid-them-part-1-c33048d4d17d

아 진짜 주행계를 생각해보라는 의미구나? 그러면 블로그에 나온대로 overflow 혹은 underflow를 해야하는 문제인 것 같다.

일단 코드를 보자.

// 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];
  }
}

생성자를 보면 msg.sender의 balances 값과 totalSupply 변수의 값을 _initialSupply로 초기화한다.

balanceOf 함수는 인자로 받은 주소의 balances 값을 알려준다.

transfer 함수는 msg.sender의 balances값에서 인자로 받은 _value의 값을 뺀 것이 0보다 같거나 크면 코드가 실행되는데, msg.sender의 balances값에서 _value 값을 빼고, 보낼 주소의 balances의 값에 _value 값을 추가해준다.

쉽게 말해 msg.sender의 balances 값을 다른 주소의 balances로 보내는 코드.

이제 그러면 내가 가지고 있는 balances와 instance가 가지고 있는 balnaces의 값을 확인해보자.

내가 가지고 있는 balances의 값은 20, instance가 가지고 있는 balances의 값은 20999980이다.

그러면 20개를 넘는 수를 전송하게 되면 unsigned int이기 때문에 내가 가진 balances의 값은 uint의 최댓값이 될 것이다.

테스트를 위해 transfer함수로 level 주소에게 21만큼의 balances를 전송해보았다.

이렇게 보니 무슨 수인지 모르겠으니 fromWei함수를 활용해보자.

와 엄청 큰 수가 나왔는데, uint의 최댓값은 2**256-1

이런 수이고, 내 balances와 동일해보인다.

이제 문제에서 원하는 조건은 달성했으니 Submit ㄱㄱ

구우우우우웃


Uploaded by N2T

'Wargame > Ethernaut' 카테고리의 다른 글

Ethernaut Level 7(Force)  (0) 2023.04.03
Ethernaut Level 6(Delegation)  (0) 2023.04.03
Ethernaut Level 4(Telephone)  (0) 2023.03.12
Ethernaut Level 3(Coin Flip)  (1) 2023.03.09
Ethernaut Level 2(Fal1out)  (0) 2023.02.21
Comments