攻击目标是使得通过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);
});