Damn vulnerable defi Challenge1 unstoppable
Damn vulnerable defi CTFs 挑战 1.Unstoppable 详解
Damn vulnerable defi 是学习以太坊智能合约攻防的网站。具有闪贷、价格预言机、NFT、DEX、lending pool,智能合约钱包、和时间锁等特性。
如何开始
- git clone github repo
- 通过 yarn 安装
- 在*.challenge.js 中填写编码
- 通过 hardhat 工具运行 test 脚本文件
挑战内容
需要通过交互使得闪贷合约停止工作
Unstoppable 内容
Unstoppable 合约中主要有 3 部分内容组成:
- ERC20 token 合约 (DamnValuableToken.sol)
- Unstoppable 主合约(UnstoppableVault.Sol)
- 调用闪贷合约的调用合约(ReceiverUnstoppable.sol)
这里还需要用到 hardhat 的 test 合约功能,如果对这部分内容不是很了解的话可以先阅读下 hardhat 的相关文档Testing contracts。
相关的命令行:
1 | npx hardhat test TEST_FILE_ROUTER |
这里和运行部署脚本有区别的地方是没有 run 命令需要注意下。
合约流程
合约的测试脚本中(unstoppable.challenge.js)包含了 3 个用户分别是部署者、发起攻击的用户、普通的调用闪贷的用户。同时也包含了 3 个合约分别是 token 合约、闪贷合约、普通调用闪贷业务的用户合约。
1 | unstoppable.challenge.js |
当 token 合约和闪贷合约部署完成之后,像闪贷合约的部署地址支付了固定数量的 token。
1 | await token.approve(vault.address, TOKENS_IN_VAULT); |
最后部署普通用户的合约,通过用户合约像借贷合约发起了一笔借贷的请求。用户部署的合约收到请求之后调用了借贷合约的 flashLoan 方法,在借贷合约中 flashLoan 会回调用户合约中的 onFlashLoan 方法。在回调完成之后需要像用户收回之前发出去的借贷 token 并按照条件收取一定的费用 fee。
代码问题点
1 | ReceiverUnstoppable.sol |
balanceBefore 在代码中表示部署的合约地址中所包含的 token 数量,而 totalSupply 只有在 mint 的时候才会累加,具体的代码在:
1 | ERC20.sol |
所以只需要让这 2 个值不相等的话请求就会 revert,通过分析我们利用 player 像合约直接发送一笔 token
解决方式
1 | it("Execution", async function () { |