ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ethernaut 풀이] 이더리움을 해킹해보자 - 4.Telephone
    BlockChain/Technology 2021. 8. 11. 13:17

    오늘의 풀어볼 문제는 Telephone 입니다.

     

    이번 예제는 간단할 수 있지만 이 예제는 간단할 수 있지만

    tx.origin과 msg.sender를 혼동하면 악의적인 피싱 공격이 일어날 수 있습니다. 

    피해자가 스스로 공격자의 악의적인 주소로 자금을 보낼 수 있습니다.

     

     

    ≪ Ethernaut 풀이 시리즈 

     

     

    [Ethernaut 풀이] 이더리움을 해킹해보자 - 0.Hello Ethernaut

    [Ethernaut 풀이] 이더리움을 해킹해보자 - 1.Fall back

    [Ethernaut 풀이] 이더리움을 해킹해보자 - 2.Fallout

     

     


    1. 목표 확인

     

    • Claim ownership of the contract below to complete this level.

    ownership만 가져오면 됩니다. 이번 level은 목표도 하나이고,  어렵지 않습니다.

    Get new instance 버튼을 눌러 인스턴스를 생성하고 시작합니다. 

     

    힌트를 보면 "Beyond the console"가 또 나왔습니다. 이 말을 들으면 자동으로 remix에 접속하게 됩니다.

    remix.org 들어가기

     

     

    2. 문제 풀이

     

    이번 코드는 굉장히 짧습니다. Owner를 바꿔야 함으로 관련된 내용이 들어가 있는 부분을 찾습니다.

     

     

    ① changeOwner

     

    함수가 하나밖에 없어서 보니 changeOwner에 주소를 입력하면 owner가 새로 바뀌게 된다. 단 하나의 조건이 있다. 

     if (tx.origin != msg.sender)

    tx.originmsg.sender가 다르면 된다.

     

    • tx.origin = 트랜잭션의 송신자의 주소입니다. 한 트랜잭션 내에서 컨트랙트를 아무리 많이 호출을 해도 tx.origin은 트랜잭션 송신자입니다. 
    • msg.sender = 메시지를 호출한 송신자의 주소입니다. 아래 그림의 경우 컨트랙트 D에서의 msg.sender는 직전 호출자인 컨트랙트 C가 됩니다. 

    우리의 컨트랙트를 보면 이 컨트랙트 주소를 통해 changeOwner()를 무한히 실행시켜도 tx.origin과 msg.sender는 항상 자기 자신의 주소가 됩니다. if의 조건을 넘어가지 못해 owner를 바꿀 수가 없습니다.

     

    ② msg.sender

     

    msg.sender는 tx.origin과 달리 상황에 따라 바뀔 수 있습니다. 이를 이용하는 것이 이번 미션의 핵심입니다.

     

    그림과 같이 컨트랙트 Telephone을 바로 호출하지 않고, 다른 컨트랙트를 거쳐서 호출하면 tx.origin과 msg.sender을 다르게 할 수 있습니다. remix에 새로운 파일을 만들고 Telephone 컨트랙트를 복사해서 붙여 넣습니다. 그리고 아래에 새로운 컨트랙트를 추가할 것입니다. 

     

    ③ Attack 컨트랙트 만들기

     

    현재 리믹스는 다음과 같이 되어 있을 것입니다. 아래에 contract Attack을 작성합니다.

     

     

     

    Attack 컨트랙트 내에 hack() 함수를 만듭니다. 함수 안에서 Telephone 컨트랙트의 주소를 넣어 접근하고, 그 안의 changeOwner함수를 실행시킵니다. 이때 msg.sender을 넘겨줍니다. 

     

    여기서 넘어가는 msg.sender는 hack() 함수를 호출한 나의 주소입니다. Telephone의 changeOwner() 함수를 보겠습니다. changeOwner() 함수는 hack() 함수를 통해 호출되었으므로 hack() 함수를 호출한 나의 주소가 tx.origin이 됩니다. 

    msg.sender의 경우 changeOwner() 함수를 호출한 존재는 hack() 함수이므로 Attack 컨트랙트의 주소가 바로 msg.sender가 됩니다.

     

     

    tx.origin과 msg.sender가 달라졌으므로 이제 owner는 나의 주소로 바뀌게 됩니다.

    목표 달성 ! 컨트랙트의 소유권을 가져오기

     

    Submit instance 버튼을 눌러 제출을 완료합니다. 수고하셨습니다 !

     

    댓글

Designed by Tistory.