这是我第一次进行[区块链安全-Damn_Vulnerable_DeFi]这个挑战,目的是想要看看别人的智能合约代码是如何写的以及学习一些安全知识。会持续更新。
这是我第一次进行这个挑战,目的是想要看看别人的智能合约代码是如何写的以及学习一些安全知识。 会持续更新。
这是一个闪电贷合约。有一个存放了一百万DVT代币的代币化保险库。它正在免费提供闪电贷款,直到宽限期结束。 为了在完全去中心化的阶段之前发现任何错误,开发人员决定在测试网中运行一个实时beta版。有一个监控合约来检查闪电贷款功能的活跃性。 从余额中拥有10个DVT代币开始,展示如何停止保险库。它必须停止提供闪电贷款。
简单来说我们作为用户,初始余额中有10个DVT代币,我们需要进行代码操作来让合约停止提供闪电贷款。
这个合约的代码问题出在UnstoppableVault.sol中的flashLoan函数中。
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance(); // enforce ERC4626 requirement
totalSupply:金库份额数量(由ERC4626提供,ERC4624继承了ERC20)。 balanceBefore:底层资产数量(由ERC20提供)。 convertToShares(uint256 assets): 这是一个传入资产数量返回对应的金库份额数量的函数。(显而易见这里传入的参数出错了,进行判断对比的变量也出错了)
在初始时金库份额数量和底层资产数量相等,即1:1,所以这个判断并不会revert。 但如果我在测试中把用户的所有余额都转账给了UnstoppableVault,那么这个合约的balance就会变多,但是totalSupply并不会增加,此时balanceBefore和totalSupply就不相等了。就会出现错误,合约会暂停。
function test_unstoppable() public checkSolvedByPlayer {
token.transfer(address(vault), INITIAL_PLAYER_TOKEN_BALANCE);
}
1.先大致了解这个标准做了什么,能解决什么事情。 2.点进合约内部查看,了解大致的功能函数。 3.明确用户可以调用的函数。
1.明确这个合约做了什么事情。 2.明确用户可以调用的函数。 3.查看测试代码,明确初始化流程。 4.仔细寻找漏洞
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!