Damn Vulnerable DeFi靶场实战(1-5)

这篇具有很好参考价值的文章主要介绍了Damn Vulnerable DeFi靶场实战(1-5)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unstoppable

分析

题目要求:

There’s a lending pool with a million DVT tokens in balance, offering
flash loans for free.

If only there was a way to attack and stop the pool from offering
flash loans …

You start with 100 DVT tokens in balance.

题目给了一个闪电贷合约,要求我们停止这个闪电贷合约继续运行。
闪电贷合约:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

interface IReceiver {
   
    function receiveTokens(address tokenAddress, uint256 amount) external;
}

/**
 * @title UnstoppableLender
 * @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)
 */
contract UnstoppableLender is ReentrancyGuard {
   

    IERC20 public immutable damnValuableToken;
    uint256 public poolBalance;

    constructor(address tokenAddress) {
   
        require(tokenAddress != address(0), "Token address cannot be zero");
        damnValuableToken = IERC20(tokenAddress);
    }

    function depositTokens(uint256 amount) external nonReentrant {
   
        require(amount > 0, "Must deposit at least one token");
        // Transfer token from sender. Sender must have first approved them.
        damnValuableToken.transferFrom(msg.sender, address(this), amount);
        poolBalance = poolBalance + amount;
    }

    function flashLoan(uint256 borrowAmount) external nonReentrant {
   
        require(borrowAmount > 0, "Must borrow at least one token");

        uint256 balanceBefore = damnValuableToken.balanceOf(address(this));
        require(balanceBefore >= borrowAmount, "Not enough tokens in pool");

        // Ensured by the protocol via the `depositTokens` function
        assert(poolBalance == balanceBefore);
        
        damnValuableToken.transfer(msg.sender, borrowAmount);
        
        IReceiver(msg.sender).receiveTokens(address(damnValuableToken), borrowAmount);
        
        uint256 balanceAfter = damnValuableToken.balanceOf(address(this));
        require(balanceAfter >= balanceBefore, "Flash loan hasn't been paid back");
    }
}

合约拥有两个函数,并使用了名为“DVT”的ERC20代币。
DVT代币合约:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

/**
 * @title DamnValuableToken
 * @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)
 */
contract DamnValuableToken is ERC20 {
   

    // Decimals are set to 18 by default in `ERC20`
    constructor() ERC20("DamnValuableToken", "DVT") {
   
        _mint(msg.sender, type(uint256).max);
    }
}

合约创造之初就给了创造者最多的代币,而我们需要让这些代币失效,也就是不能进行使用。

UnstoppableLender.sol合约中定义了两个函数,depositTokens和flashloan,前者用来向合约增加代币,后者则是闪电贷函数,其中又限定了调用者满足IReceiver接口,因此借贷者也应该是一个合约,题目也给出了借贷者的合约。

借贷者合约:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../unstoppable/UnstoppableLender.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/**
 * @title ReceiverUnstoppable
 * @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)
 */
contract ReceiverUnstoppable {
   

    UnstoppableLender private immutable pool;
    address private immutable owner;

    constructor(address poolAddress) {
   
        pool = UnstoppableLender(poolAddress);
        owner = msg.sender;
    }

    // Pool will call this function during the flash loan
    function receiveTokens(address tokenAddress, uint256 amount) external {
   
        require(msg.sender == address(pool), "Sender must be pool");
        // Return all tokens to the pool
        require(IERC20(tokenAddress).transfer(msg.sender, amount), "Transfer of tokens failed");
    }

    function executeFlashLoan(uint256 amount) external {
   
        require(msg.sender == owner, "Only owner can execute flash loan");
        pool.flashLoan(amount);
    }
}

该合约只有两个函数,一个函数用来将借到的通证返还给闪电贷合约,另一个函数用来向闪电贷合约借通证,并限制借贷者只能是owner。
我们来分析一下闪电贷合约中的几个限制条件的含义分别是什么。

  • require(borrowAmount > 0, "Must borrow at least one token");此项防止无意义的借贷,确保每次运行确实进行借贷了
  • require(balanceBefore >= borrowAmount, "Not enough tokens in pool");此项是确保有足够的通证余额进行借贷
  • assert(poolBalance == balanceBefore);此项是为了保证合约中现在的通证,与之前的通证相同
  • require(balanceAfter >= balanceBefore, "Flash loan hasn't been paid back");此项是为了确保借贷者合约将通证进行了返还

我们注意到函数中的第三个限制条件,balanceBefore是合约现在的余额,而poolBalance是合约之间的余额,并且这个变量只在depositToken中进行了修改,但是我们并不仅仅只有这一种方法为合约增加通证,我们从这一点切入进行攻击。

攻击

攻击代码:

it('Exploit', async function () {
   
        /** CODE YOUR EXPLOIT HERE */
            await this.token.transfer(this.pool.address,1)
    });

我们仅仅是在攻击区域增加了 await this.token.transfer(this.pool.address,1),为合约发送了一个DVT通证,这时合约的poolBalance并没有发生变化,但余额其实增加了1DVT,所以一旦想要再次借贷,poolBalance和balanceBefore并不相等,无法正常借贷。
damn vulnerable defi,solidity,区块链,区块链,开发语言
攻击完成

Naive Receiver

分析

题目要求:

There’s a lending pool offering quite expensive flash loans of Ether,
which has 1000 ETH in balance.

You also see that a user has deployed a contract with 10 ETH in
balance, capable of interacting with the lending pool and receiveing
flash loans of ETH.

Drain all ETH funds from the user’s contract. Doing it in a single
transaction is a big plus

大意就是有一个高利贷的闪电贷合约,借贷池中有一千个eth,而用户拥有十个eth,我们要做的就是将用户的这十个ETH掏空。让我们来看看合约
闪电贷合约:文章来源地址https://www.toymoban.com/news/detail-671217.html

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title NaiveReceiverLenderPool
 * @author Damn Vulnerable DeFi (https://damnvulnerabledefi.xyz)
 */
contract NaiveReceiverLenderPool is ReentrancyGuard {
   

    using Address for addre

到了这里,关于Damn Vulnerable DeFi靶场实战(1-5)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 警告:Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30

    SpringBoot 的 validation 依赖包含有易受攻击的依赖 snakeyaml。 警告信息如下: Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30 意思是:提供了可传递的易受攻击依赖 maven:org.yaml:snakeyaml:1.30 使用 dependencyManagement ,将所有的 snakeyaml 统一改成没有隐患的版本。

    2024年02月10日
    浏览(28)
  • idea显示pom.xml文件漂黄警告 Dependency maven:xxx:xxx is vulnerable

    场景: idea警告某些maven依赖包有漏洞或者依赖传递有易受攻击包,如下: 解决: 1、打开idea设置,找到 File | Settings | Editor | Inspections 2、取消上述两项勾选即可  

    2024年02月05日
    浏览(34)
  • pom.xml中解决Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.33警告

    构建springboot3项目时,pom文件的spring-boot-starter-web依赖部分整体高亮, 显示Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.33 这个警告提示我们的Maven项目中使用了一个被认为是有漏洞的依赖项,并且这个依赖项也被其他依赖项所传递。 具体来说,这个警告是指: 在我们

    2023年04月23日
    浏览(80)
  • DeFi 永不消亡?

    过去几个月,加密行业遭受的打击可谓史无前例:身家数十亿美元的加密货币银行面临破产危机、最大的对冲基金通过抛售NFT来以应对清算、中心化加密机构面临崩盘……但令人惊讶的是,在经历了这场风暴之后,DeFi却依然屹立不倒,相信这也正体现了加密社区一直对外宣扬

    2023年04月08日
    浏览(18)
  • DeFi收益来源全面概述

    去中心化金融一个主要的优势就是它对所有人开放,任何人在任何时间、任何地点都可以参与其中。这样一来,作为DeFi参与者就有机会获得在传统金融领域很难获得或根本不可能获得的收益。 加密货币的特性是开源的、无需许可的,这将DeFi变成了一个又深又广的复杂生态系

    2024年01月20日
    浏览(21)
  • 区块链DeFi项目不可忽略的指标

    转载原文链接:http://www.btcwbo.com/5006.html 区块链的世界打破了数据源的障碍。它就像桌面上的一本大书。数据是完全开放和透明的。然而,显然更难在大量模糊的数据中找到有价值的信息。 数据可以被认为是任何项目中最重要的资产。数据分析可以了解过去、现状,甚至预测

    2023年04月08日
    浏览(34)
  • 重塑DeFi:深入了解Solaris Network

    Solaris Network已经在充满活力的去中心化金融(DeFi)领域崭露头角,成为一家颠覆性的平台,使用户能够创造和交易合成资产。凭借其致力于多链集成、创新功能和以社区为中心的方法,Solaris Network正在改变DeFi的格局,为全球用户提供无与伦比的机会。 在这篇文章中,我们将

    2024年02月08日
    浏览(25)
  • 编程语言如何推动DeFi成为主流?

    随着DeFi的快速增长,提供DeFi服务的平台和产品也如雨后春笋般纷纷冒头。作为衡量DeFi协议管理资金规模的标准之一,DeFi“总锁仓量”在过去两年一路从100亿美元增长到超400亿美元,期间更是一度冲上1800亿美元的巅峰。但直到今天,智能合约编程语言功能并没有足够完善到

    2024年02月01日
    浏览(38)
  • 什么是 DeFi(去中心化金融)?

    Defi是自己掌握私钥,以数字货币为主体的金融业务。 首先, DeFi是加密金融体系的一种模式 。按照是否涉及加密资产,可以将金融体系区分为传统金融体系(不涉及加密资产)和加密金融体系。其中,按照是否要依托中心化的金融机构或者交易场所,可以将加密金融体系划

    2024年02月02日
    浏览(46)
  • Uniswap V2 — 从代码解释 DeFi 协议

    为了理解我们在分析代码时将要经历的不同组件,首先了解哪些是主要概念 以及 它们 的作用 是很重要的。所以,和我一起裸露吧,因为这是值得的。 我在 5 个段落中总结了您需要了解的主要重要概念,您将在本文结束时理解这些概念。 Uniswap 是一种 去中心化交易 协议 。

    2023年04月22日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包