HigherOrder


文档摘要

HigherOrder 题目描述 原题 in Sepolia 目标是使我们的账户地址成为合约中的commander。 运行 根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令: 功能简述 要想改变 变量,只能让 变量大于255。而改变 变量只能通过 函数。 而 中在改变 变量时,是直接读取了我们交易调用calldata的第4个字节后的32字节数据。然后将这32字节的数据写入了 变量所在的插槽。(calldata的前4个字节为函数签名selector) 所以,我们只需调用 ,并在 的 后拼接 变量的值(例如,修改为 ) 虽然 接受的是 的变量,但是,函数逻辑里却是使用 读取了32字节的数据。只需要 前4个字节的selector正确 ,就可以调用 。

HigherOrder

题目描述

原题 in Sepolia

目标是使我们的账户地址成为合约中的commander。

运行

根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:

$ cd WTF-CTF $ forge test -C src/Ethernaut/HigherOrder -vvvvv

功能简述

要想改变commander变量,只能让treasury变量大于255。而改变treasury变量只能通过registerTreasury(uint8)函数。

registerTreasury函数中在改变treasury变量时,是直接读取了我们交易调用calldata的第4个字节后的32字节数据。然后将这32字节的数据写入了treasury变量所在的插槽。(calldata的前4个字节为函数签名selector)

所以,我们只需调用registerTreasury函数,并在calldataselector后拼接treasury变量的值(例如,修改为type(uint256).max

abi.encodeWithSignature("registerTreasury(uint8)", type(uint256).max)

虽然registerTreasury函数接受的是uint8的变量,但是,函数逻辑里却是使用calldataload读取了32字节的数据。只需要calldata前4个字节的selector正确 ,就可以调用registerTreasury函数


发布者: 作者: 转发
评论区 (0)
U