Challenge1-UnstoppableUnstoppable为了系统的学习solidity和foundry,我基于foundry测试框架重新编写damnvulnerable-defi的题解,欢迎交流和共建~🎉https://github.com/zach030/damnvulnerable
为了系统的学习solidity和foundry,我基于foundry测试框架重新编写damnvulnerable-defi的题解,欢迎交流和共建~🎉
攻击目标是使得通过ReceiverUnstoppable合约发起的executeFlashLoan方法被revert,首先分析executeFlashLoan的调用流程
重点在UnstoppableVault.flashLoan方法,分别会进行以下操作:
若要使交易revert,关键的校验点在于使得:convertToShares(totalSupply) != totalAssets()
这两个函数都是ERC4626中的定义,关于此协议可参考下面的文章: WTF-Solidity/51_ERC4626/readme.md at main · WTFAcademy/WTF-Solidity
简单来说就是ERC20的组合:资产代币asset和份额代币share,存入资产或提取资产时都会相对应的铸造或销毁对应数目的share代币
totalAssets()
:计算的是当前金库中的资产代币数目convertToShares(totalSupply)
:totalSupply是总的share代币数目(只有deposit或mint时才会产生),convertToShares就是计算:assets * totalSupply / totalAssets()要想使得两者不一致,只要不通过depost或mint方法向UnstoppableVault中转入token即可,因此攻击脚本内容如下:
it('Execution', async function () {
/** CODE YOUR SOLUTION HERE */
const dvtForPlayer = token.connect(player);
await dvtForPlayer.transfer(vault.address,1);
});
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!