29.Switch
2023-07-20 00:42:54
# 04.Ethernaut CTF
Switch
题目
要求:将switchOn设置为true
1 | // SPDX-License-Identifier: MIT |
分析
考察calldata编码
因为onlyThis的限制,所以需要调用
flipSwitch()
,然后本合约再去调用turnSwitchOn()
完成题目。onlyOff()
calldatacopy(t, f, s)
:从位置f的calldata复制s字节到位置t的内存中,把输入数据加载到Memory中。那么这里就是将calldata的第68字节之后4个字节的数据复制到selector中,然后和offSelector作比较不用担心4字节和32字节怎么比较,因为无论他是补0还是截断比较,只要前四字节相同,都是可以通过的(好吧是我不想研究它是补0比较还是截断比较的了:hankey:)
不要直接直接调用合约实例的flipSwitch()方法然后传参,这样是错的!因为你传入_data数据的时候,会自动帮你做ABI包装,这样就无法通过检查了,我们要自己构造calldata!然后用ethersjs发送原始数据进行交互
1
2
3
4
5
630c13ade // 这是flipSwitch()函数选择器
0x00 0000000000000000000000000000000000000000000000000000000000000060 // 0x60之后的32字节是实际数据
0x20 0000000000000000000000000000000000000000000000000000000000000000 // 补0
0x40 20606e1500000000000000000000000000000000000000000000000000000000 // 通过onlyOff()的检验
0x60 0000000000000000000000000000000000000000000000000000000000000004 // turnSwitchOn()的函数选择器长度
0x80 76227e1200000000000000000000000000000000000000000000000000000000 // 根据长度截取内容,然后执行call()
解题
1 | const {ethers} = require("ethers") |