Defi安全挑战系列-Damn Vulnerable DeFi(#5 The Rewarder)
有一个池子每隔5天给那些将他们的DVT代币存入其中的人提供代币奖励。 Alice、Bob、Charlie和David已经存入了一些DVT代币,并获得了他们的奖励! 你没有任何DVT代币。但是在即将开始的这一轮中,你必须为自己争取最多的奖励。 顺便说一下,有传言说一个新的池子刚刚启动。它不是提供DVT代币的闪电贷款吗?https://www.damnvulnerabledefi.xyz/challenges/the-rewarder/分析合约ERC20Snapshot.sol AccountingToken.sql中的ERC20Snapshot看名字就知道跟快照相关,看逻辑发现实现快照很巧妙。其中:_currentSnapshotId 第几次快照mapping(address => Snapshots) private _accountBalanceSnapshots; 记录目标地址快照数据struct Snapshots { uint256[] ids; uint256[] values; } ids意思第几次快照,和values数组长度是对应的,values代表当时快照的余额f...
Defi安全挑战系列-Damn Vulnerable DeFi(#5 The Rewarder)
有一个池子每隔5天给那些将他们的DVT代币存入其中的人提供代币奖励。 Alice、Bob、Charlie和David已经存入了一些DVT代币,并获得了他们的奖励! 你没有任何DVT代币。但是在即将开始的这一轮中,你必须为自己争取最多的奖励。 顺便说一下,有传言说一个新的池子刚刚启动。它不是提供DVT代币的闪电贷款吗?https://www.damnvulnerabledefi.xyz/challenges/the-rewarder/分析合约ERC20Snapshot.sol AccountingToken.sql中的ERC20Snapshot看名字就知道跟快照相关,看逻辑发现实现快照很巧妙。其中:_currentSnapshotId 第几次快照mapping(address => Snapshots) private _accountBalanceSnapshots; 记录目标地址快照数据struct Snapshots { uint256[] ids; uint256[] values; } ids意思第几次快照,和values数组长度是对应的,values代表当时快照的余额f...
Defi安全挑战系列-Damn Vulnerable DeFi(#15 ABI Smuggling)
有一个权限设置的保险库,其中存入了一百万个DVT代币。该保险库允许定期提取资金,并在紧急情况下全部提取资金。该合约内嵌了一个通用的授权方案,只允许已知账户执行特定操作。 开发团队收到了一个负责任的披露,称所有资金都可以被盗取。 在为时已晚之前,从保险库中解救出所有资金,并将它们转回恢复账户。https://www.damnvulnerabledefi.xyz/challenges/abi-smuggling/分析合约下面是solidty二进制接口说明文档 https://solidity-cn.readthedocs.io/zh/develop/abi-spec.html SelfAuthorizedVault.sol合约中的execute方法: function execute(address target, bytes calldata actionData) external nonReentrant returns (bytes memory) { // Read the 4-bytes selector at the beginning of `actionData` ...
Defi安全挑战系列-Damn Vulnerable DeFi(#15 ABI Smuggling)
有一个权限设置的保险库,其中存入了一百万个DVT代币。该保险库允许定期提取资金,并在紧急情况下全部提取资金。该合约内嵌了一个通用的授权方案,只允许已知账户执行特定操作。 开发团队收到了一个负责任的披露,称所有资金都可以被盗取。 在为时已晚之前,从保险库中解救出所有资金,并将它们转回恢复账户。https://www.damnvulnerabledefi.xyz/challenges/abi-smuggling/分析合约下面是solidty二进制接口说明文档 https://solidity-cn.readthedocs.io/zh/develop/abi-spec.html SelfAuthorizedVault.sol合约中的execute方法: function execute(address target, bytes calldata actionData) external nonReentrant returns (bytes memory) { // Read the 4-bytes selector at the beginning of `actionData` ...
Defi安全挑战系列-Damn Vulnerable DeFi(#14 Puppet V3)
即使在熊市中,贷款池背后的开发人员仍在不断构建。 在最新版本中,他们正在使用 Uniswap V3 作为预言机。没错,不再使用现货价格!这次,该池查询资产的时间加权平均价格,并使用了所有推荐的库。 Uniswap 市场提供了100个WETH和100个DVT的流动性。贷款池拥有一百万个DVT代币。 从1个ETH和一些DVT开始,通过从贷款池中获取所有代币来通过此挑战。 注意:与其他挑战不同,此挑战要求您在挑战的测试文件中设置有效的RPC URL,将主网状态分叉到您的本地环境中。https://www.damnvulnerabledefi.xyz/challenges/puppet-v3/分析合约解决方案创建PuppetV3Attack.sol//SPDX-License-Identifier:MIT pragma solidity >0.7.0; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; import "@uniswap/v3-periphery/contracts/libraries/Or...
Defi安全挑战系列-Damn Vulnerable DeFi(#14 Puppet V3)
即使在熊市中,贷款池背后的开发人员仍在不断构建。 在最新版本中,他们正在使用 Uniswap V3 作为预言机。没错,不再使用现货价格!这次,该池查询资产的时间加权平均价格,并使用了所有推荐的库。 Uniswap 市场提供了100个WETH和100个DVT的流动性。贷款池拥有一百万个DVT代币。 从1个ETH和一些DVT开始,通过从贷款池中获取所有代币来通过此挑战。 注意:与其他挑战不同,此挑战要求您在挑战的测试文件中设置有效的RPC URL,将主网状态分叉到您的本地环境中。https://www.damnvulnerabledefi.xyz/challenges/puppet-v3/分析合约解决方案创建PuppetV3Attack.sol//SPDX-License-Identifier:MIT pragma solidity >0.7.0; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; import "@uniswap/v3-periphery/contracts/libraries/Or...
Defi安全挑战系列-Damn Vulnerable DeFi(#13 Wallet Mining)
有一个合约激励用户部署Gnosis Safe钱包,并奖励他们1个DVT代币。它与可升级的授权机制集成。这样可以确保只有被允许的部署者(也称为照管人)才会因特定的部署而获得报酬。需要注意的是,系统的某些部分已经被匿名CT大师高度优化。 部署者合约只能与官方的Gnosis Safe工厂合约(地址为0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B)和相应的主合约(地址为0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F)配合使用。不过不清楚它应该如何工作——这些合约尚未在该链上部署。 与此同时,似乎有人将2000万个DVT代币转移到了地址0x9b6fb606a9f5789444c17768c6dfcf2f83563801。这个地址已经被授权合约的一个照管人使用。奇怪的是,因为这个地址也是空的。 通过获取钱包部署者合约持有的所有代币来完成挑战。哦,还有那2000万个DVT代币。https://www.damnvulnerabledefi.xyz/challenges/wallet-mining/分析合约其实这次挑战的背...
Defi安全挑战系列-Damn Vulnerable DeFi(#13 Wallet Mining)
有一个合约激励用户部署Gnosis Safe钱包,并奖励他们1个DVT代币。它与可升级的授权机制集成。这样可以确保只有被允许的部署者(也称为照管人)才会因特定的部署而获得报酬。需要注意的是,系统的某些部分已经被匿名CT大师高度优化。 部署者合约只能与官方的Gnosis Safe工厂合约(地址为0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B)和相应的主合约(地址为0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F)配合使用。不过不清楚它应该如何工作——这些合约尚未在该链上部署。 与此同时,似乎有人将2000万个DVT代币转移到了地址0x9b6fb606a9f5789444c17768c6dfcf2f83563801。这个地址已经被授权合约的一个照管人使用。奇怪的是,因为这个地址也是空的。 通过获取钱包部署者合约持有的所有代币来完成挑战。哦,还有那2000万个DVT代币。https://www.damnvulnerabledefi.xyz/challenges/wallet-mining/分析合约其实这次挑战的背...
Defi安全挑战系列-Damn Vulnerable DeFi(#12 Climber)
有一个安全保险库合约,保管着1000万个DVT代币。该保险库是可升级的,遵循UUPS模式。保险库的所有者目前是一个时间锁合约,每15天可以提取一小部分代币。 在保险库中还有一个额外的角色,在紧急情况下可以清空所有代币。 在时间锁合约上,只有具有“提案者”角色的帐户才能安排一小时后执行的操作。 要通过这个挑战,从保险库中取走所有代币。分析合约这次挑战很有意思,解题有点绕。 我们的目的是调用ClimberVault.sol中sweepFunds方法获取所有币,但是这样个方法被onlySweeper限制了,_sweeper在构造函数中就被设置了,好像没戏了。但是合约使用的是UUPS代理模式,如果能获取合约管理权限,重新部署合约,再去掉onlySweeper限制,就可以达到目的了。如何获得合约管理权限呢?构造函数中transferOwnership(address(new ClimberTimelock(admin, proposer))); 意思合约管理权限给了ClimberTimelock 合约,好,问题转移,想办法让ClimberTimelock 的升级ClimberVault.s...
Defi安全挑战系列-Damn Vulnerable DeFi(#12 Climber)
有一个安全保险库合约,保管着1000万个DVT代币。该保险库是可升级的,遵循UUPS模式。保险库的所有者目前是一个时间锁合约,每15天可以提取一小部分代币。 在保险库中还有一个额外的角色,在紧急情况下可以清空所有代币。 在时间锁合约上,只有具有“提案者”角色的帐户才能安排一小时后执行的操作。 要通过这个挑战,从保险库中取走所有代币。分析合约这次挑战很有意思,解题有点绕。 我们的目的是调用ClimberVault.sol中sweepFunds方法获取所有币,但是这样个方法被onlySweeper限制了,_sweeper在构造函数中就被设置了,好像没戏了。但是合约使用的是UUPS代理模式,如果能获取合约管理权限,重新部署合约,再去掉onlySweeper限制,就可以达到目的了。如何获得合约管理权限呢?构造函数中transferOwnership(address(new ClimberTimelock(admin, proposer))); 意思合约管理权限给了ClimberTimelock 合约,好,问题转移,想办法让ClimberTimelock 的升级ClimberVault.s...