DamnVulnerableDeFi-Unstoppable题解

挑战描述网站：https://www.damnvulnerabledefi.xyz/
挑战源码地址：https://github.com/tinchoabbate/damn-vulnerable-defi

Unstoppable

题目描述：
There’s a tokenized vault with a million DVT tokens deposited. It’s offering flash loans for free, until the grace period ends.

To pass the challenge, make the vault stop offering flash loans.

You start with 10 DVT tokens in balance.

解析

由题意得知我们的目标是为了破环合约让合约的闪电贷服务终止。
带着这样的目标我们去看看合约是怎么实现闪电贷的。

可以观察到的一点比较奇怪的判断是这一句:

Copy
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance(); // enforce ERC4626 requirement

观察到变量 balanceBefore 是该地址的 ERC20 Token 余额

并不是 ERC20 标准中由 mint burn 控制的 TotalSupply。

所以攻击该合约只需要补充一行 transfer token 代码就可以让该 totalSupply != balanceBefore 从而让该闪电贷停止工作。

题解

Copy
it('Execution', async function () {
await token.connect(player).transfer(vault.address, 1);
});

完整题解地址：https://github.com/fenghaojiang/damn-vulnerable-defi/tree/master/test/unstoppable