Denial 题目描述 原题 in Sepolia 拒绝用户提取资金 (此时合约仍有资金,并且交易的 gas 为 1M 或更少)。 运行 根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令: 功能简述 call 如果异常会转账失败,只会返回false,不会最终停止执行, 没有gas限制 call方法会将调用结果以true和false的形式返回,即调用过程中有错误发生,也不会影响后续的代码。 所以只有让gas在外部call时全部消耗掉,无法运行后续代码。 或者进行重新攻击,转走合约中的所有本币。但是题目要求的 。就不能转完合约里全部的钱。 如果使用低级别 外部调用,请确保指定固定的 gas 津贴。例如 。
拒绝用户提取资金withdraw()(此时合约仍有资金,并且交易的 gas 为 1M 或更少)。
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF $ forge test -C src/Ethernaut/Denial -vvvvv
call 如果异常会转账失败,只会返回false,不会最终停止执行, 没有gas限制
// The recipient can revert, the owner will still get their share partner.call{value: amountToSend}("");
call方法会将调用结果以true和false的形式返回,即调用过程中有错误发生,也不会影响后续的代码。
所以只有让gas在外部call时全部消耗掉,无法运行后续代码。
receive() external payable { // 消耗掉所有gas值 while(true){} }
或者进行重新攻击,转走合约中的所有本币。但是题目要求的whilst the contract still has funds。就不能转完合约里全部的钱。
如果使用低级别call外部调用,请确保指定固定的 gas 津贴。例如call{gas: 100000}("")。