GoodSamaritan


Good Samaritan

题目描述

原题 in Sepolia

将wallet合约中的Coin代币余额清零。

运行

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

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

功能简述

题目说我们要掏空Wallet中的Coin

  1. 重入攻击

    合约中的requestDonation函数没有检查重入攻击,一次请求10个,一共10**6个。怕是要花不少Gas。

  2. 当Wallet合约中Coin余额不足10时,会触发transferRemainder将剩余所有Coin转移给请求者。

    而触发transferRemainder的条件是GoodSamaritan合约检测到NotEnoughBalance()错误。

    但GoodSamaritan合约却无法知道这个NotEnoughBalance()错误是谁发出的。

    Coin代币在transfer时会检测接受地址是否为合约地址,如果是合约地址,会进行notify接口调用。

    所以我们可以写攻击合约,在攻击合约接受Coin代币时发出NotEnoughBalance()错误。让GoodSamaritan合约将Wallet合约中的所有Coin转给我们。

function notify(uint256 amount) public pure { if (amount == 10) { revert NotEnoughBalance(); } } ​
作者与出处
原作者:WTFAcademy
来源:WTFAcademy
许可证:MIT
整理人: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: WTFAcademy 转发
评论区 (0)
U