Good Samaritan 题目描述 原题 in Sepolia 将wallet合约中的Coin代币余额清零。 运行 根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令: 功能简述 题目说我们要掏空 中的 重入攻击 合约中的 函数没有检查重入攻击,一次请求10个,一共106个。怕是要花不少Gas。 当 合约中 余额不足10时,会触发 将剩余所有 转移给请求者。 而触发 的条件是 合约检测到 错误。 但 合约却无法知道这个 错误是谁发出的。 代币在 时会检测接受地址是否为合约地址,如果是合约地址,会进行 接口调用。 所以我们可以写攻击合约,在攻击合约接受 代币时发出 错误。让 合约将 合约中的所有 转给我们。
将wallet合约中的Coin代币余额清零。
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF $ forge test -C src/Ethernaut/Good_Samaritan -vvvvv
题目说我们要掏空Wallet中的Coin
重入攻击
合约中的requestDonation函数没有检查重入攻击,一次请求10个,一共10**6个。怕是要花不少Gas。
当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(); } }