1. 题目要求
- 要求: 获取合约的所有权
- 合约代码:
1 | // SPDX-License-Identifier: MIT |
2. 分析
2.1 状态owner变量在constructor,唯一会更新owner的函数是 changeOwner(),它是一个只接受一个参数的公共函数
address _owner
。如果tx.origin
值不同,msg.sender
它将owner
使用函数输入参数更新_owner
。2.2 tx.origin() 和 msg.sender()的区别
tx.origin(address): 交易的发送方(完整的调用链)返回的是已发送(原始)交易的地址
msg.sender
(address
):消息的发送者(当前通话)返回的是发起呼叫的值external(合约调用者)画图区分:
2.3 攻击合约:
contract Hack { function exploit(Telephone level) public { level.changeOwner(msg.sender); } }
2.4 调用Hack 合约中的 exploit()函数,形参是关卡的实例地址就🆗的
3. 解题
3.1 获取关卡的实例:0xf956A62d9BD792a712763aA21863d3025A5dd926
3.2 调用关卡合约并部署攻击合约
3.3 查看原拥有着,并调用攻击合约中额exploit() 函数
3.4 提交实例并查看结果
3.5 成功!!!!