새소식

인기 검색어

Write Up/Ethernaut

[Ethernaut] Recovery

  • -
반응형

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

contract Recovery {

  //generate tokens
  function generateToken(string memory _name, uint256 _initialSupply) public {
    new SimpleToken(_name, msg.sender, _initialSupply);
  
  }
}

contract SimpleToken {

  string public name;
  mapping (address => uint) public balances;

  // constructor
  constructor(string memory _name, address _creator, uint256 _initialSupply) {
    name = _name;
    balances[_creator] = _initialSupply;
  }

  // collect ether in return for tokens
  receive() external payable {
    balances[msg.sender] = msg.value * 10;
  }

  // allow transfers of tokens
  function transfer(address _to, uint _amount) public { 
    require(balances[msg.sender] >= _amount);
    balances[msg.sender] = balances[msg.sender] - _amount;
    balances[_to] = _amount;
  }

  // clean up after ourselves
  function destroy(address payable _to) public {
    selfdestruct(_to);
  }
}

우리의 mission은 Simple token을 만드려고 0.001 ether를 보냈는데 그 contract주소를 잃어버렸다. 그래서 contract 주소를 찾아서 다시 0.001 ether를 보내면 된다.

 

파괴된 contract의 주소는 etherscan.io에서 추적이 가능하다.

etherscan에서 CA를 입력하면 Contract Creation이 나온다.

Contract creation을 누르면 To에 CA가 나오고 Value로 0.001 ether가 나와 있다.

즉 Simple Contract의 CA는 0xfd3b305107bacec22c2bc7651a6b48fd9f7ec059이다.

그러면 target을 Simple Contract CA로 하고 selfdestruct를 하면 된다.

Simple Contract CA를 remix에 넣고 _to에 EOA를 넣으면 selfdestruct가 실행 되면서 0.001 ether는 내 지갑으로 온다.

문제를 풀고 보면 이더리움은 주소를 생성할 때 규칙이 있다.

address와 nonce를 통하여 주소를 생성하고 keccak256(address, nonce)와 같은 규칙으로 생성한다.

반응형

'Write Up > Ethernaut' 카테고리의 다른 글

[Ethernaut] Denial  (0) 2023.02.13
[Ethernaut] Alien Codex  (0) 2023.02.10
[Ethernaut] Privacy  (0) 2023.02.09
[Ethernaut] Naught Coin  (0) 2023.02.09
[Ethernaut] Gatekeeper Two  (0) 2023.02.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.