将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();
}
}