题目描述

image.png

解题过程

题目源码

  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.6.0;
  3. contract Telephone {
  4. address public owner;
  5. constructor() public {
  6. owner = msg.sender;
  7. }
  8. function changeOwner(address _owner) public {
  9. if (tx.origin != msg.sender) {
  10. owner = _owner;
  11. }
  12. }
  13. }

这里需要区分 tx.origin 和 msg.sender ,msg.sender是函数的直接调用方,
而 tx.origin 则必然是这个交易的原始发起方,无论中间有多少次合约内/跨合约函数调用,一定是账户地址而不是合约地址。
image.png
会到代码块中, 需要做到的是 tx.origin != msg.sender

  1. function changeOwner(address _owner) public {
  2. if (tx.origin != msg.sender) {
  3. owner = _owner;
  4. }
  5. }

如上图,我们只需要部署一个第三方合约A调用目标合约B,就可以通过判断获取 owner权限
image.png