[Ethernaut CTF] Telephone

0xDave·2022년 10월 3일
0

Ethereum

목록 보기
25/112

소스코드


// SPDX-License-Identifier: MIT
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;
    }
  }
}

해결 과제


Claim ownership of the contract below to complete this level.

  Things that might help

    See the Help page above, section "Beyond the console"

ownership 가져오기


해결 과정


tx.originmsg.sender와 비슷한 의미를 가진다. 하지만 위 설명처럼 연쇠적으로 호출할 때 가장 처음에 호출한 계정을 의미한다. 따라서 tx.orgin은 컨트랙트 계정이 될 수 없다.

ownership을 가져오려면 tx.originmsg.sender 값이 달라야 한다. 그럼 외부 컨트랙트에서 changeOwner() 함수를 호출하면 되지 않을까?

예를 들어 Calling 컨트랙트를 만들어서 changeOwner() 함수를 호출한다고 했을 때, 컨트랙트를 만들고 호출한 내 메타마스크 계정이 tx.origin이 되고 Calling 컨트랙트가 자체적으로 changeOwner() 함수를 호출하니까 msg.sender가 되서 결국 ownership이 넘어오지 않을까 하는 생각이다.

컨트랙트는 간단하다. 그냥 changeOwner() 함수만 호출했다.

ownership 가져오기 성공! 이번 예제의 교훈은 tx.origin으로 권한설정하지 말 것.

profile
Just BUIDL :)

0개의 댓글