EGD价格操纵攻击事件原理分析--phalcon+etherscan

这篇具有很好参考价值的文章主要介绍了EGD价格操纵攻击事件原理分析--phalcon+etherscan。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

其它相关内容可见:个人主页

EGD攻击事件相关信息

发生在BSC上

  • 攻击者地址:Address 0xee0221d76504aec40f63ad7e36855eebf5ea5edd | BscScan

  • 攻击合约:Contract Address 0xc30808d9373093fbfcec9e026457c6a9dab706a7 | BscScan

  • 攻击交易:BNB Smart Chain Transaction Hash (Txhash) Details | BscScan

  • 受害合约的地址:EGD_Finance | Address 0x93c175439726797dcee24d08e4ac9164e88e7aee | BscScan

EGD-Finance代码分析及攻击流程讲解

EGD_Finance合约的调用都是通过代理合约进行调用

在区块链浏览器上点击“Read as Proxy”可以查看到最终的合约。

EGD Finance合约中实现的主要功能就是质押USDT一段时候,可提取奖励EGD token,相当于银行存款,存一段时间之后可以提取利息。

下面质押步骤和兑换奖励步骤都是攻击者真实发起的交易步骤

质押步骤

Address 0xbc5e8602c4fba28d0efdbf3c6a52be455d9558f5 | BscScan 调用攻击合约的stake()函数进行相应的抵押操作,该地址应该也是攻击者地址,其创建了攻击合约

具体交易如下:BNB Smart Chain Transaction Hash (Txhash) Details | BscScan

我们可以在Phalcon上看到该交易的具体调用信息:

EGD价格操纵攻击事件原理分析--phalcon+etherscan,Defi学习,区块链安全,区块链

这里进一步进行分析:

EGD_Finance | Address 0x93c175439726797dcee24d08e4ac9164e88e7aee | BscScan中bond()函数应该只是填写以下邀请人,应该跟web2一样,每个地址的邀请人和质押收益相关

function bond(address invitor) external {        
        require(userInfo[msg.sender].invitor == address(0), 'have invitor');
        require(userInfo[invitor].invitor != address(0) || invitor == fund, 'wrong invitor');
        userInfo[msg.sender].invitor = invitor;
        userInfo[invitor].refer ++;

    }

接下来的swapETHForExactTokens()调用是Defi中很常见的代币交换操纵,通过地址看源码,其与uniswap_v2的对应函数一致

从名称中可以看出是向通过不确定数量的ETH来换取一定数量的代币,可以确定交换的是USDT

uniswap的参数列表

function swapETHForExactTokens(
    uint amountOut, // 交易获得的代币数量
    address[] calldata path, // 交易路径列表
    address to, // 交易获得的 token 发送到的地址
    uint deadline // 过期时间
) external virtual override payable ensure(deadline) returns (
    uint[] memory amounts // 交易期望数量列表
){
    ...
}

PancakeSwap: Router v2 | Address 0x10ed43c718714eb63d5aa57b78b54704e256024e | BscScan

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
    	//检查是否为WETH进行交换
        require(path[0] == WETH, 'PancakeRouter: INVALID_PATH');
        // 从library中获知得到amountOut数量的USDT,需要多少ETH
        amounts = PancakeLibrary.getAmountsIn(factory, amountOut, path);
        //发给pancake的ETH必须大于所需数量
        require(amounts[0] <= msg.value, 'PancakeRouter: EXCESSIVE_INPUT_AMOUNT');
        // 将 WETH 换成 ETH(对应phalcon的操作)
        IWETH(WETH).deposit{value: amounts[0]}();
        // 将 amounts[0] 数量的 path[0] 代币从用户账户中转移到 path[0], path[1] 的流动池
        assert(IWETH(WETH).transfer(PancakeLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        // 按 path 列表执行交易集合,不细究了,之后再详细看uniswap-qwq
        _swap(amounts, path, to);
        // 返回多余的ETH
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

最后调用代理合约的stake()函数,质押100个USDT,从Phalcon中的调用记录可看出,具体函数代码不进行分析了,主要是记录了很多相关信息,用于后续的奖励计算,可见EGD_Finance | Address 0x93c175439726797dcee24d08e4ac9164e88e7aee | BscScan

EGD价格操纵攻击事件原理分析--phalcon+etherscan,Defi学习,区块链安全,区块链

兑换奖励步骤

Address 0xee0221d76504aec40f63ad7e36855eebf5ea5edd | BscScan攻击者调用攻击合约的harvest()函数进行相应的兑换奖励,phalcon的交易分析如下图所示:

EGD价格操纵攻击事件原理分析--phalcon+etherscan,Defi学习,区块链安全,区块链

首先调用合约的calculateAll()函数对用户的质押奖励进行计算,计算用户总共能得到多少收益

    function calculateReward(address addr, uint slot) public view returns (uint){
        UserSlot memory info = userSlot[addr][slot];
        if (info.leftQuota == 0) {
            return 0;
        }
        uint totalRew = (block.timestamp - info.claimTime) * info.rates;
        if (totalRew >= info.leftQuota) {
            totalRew = info.leftQuota;
        }
        return totalRew;
    }

随后用户就展开了闪电贷操作,

先是通过PancakeSwap(0x16b9a82891338f9ba80e2d6970fdda79d1eb0dae)调用swap()函数借到200个USDT,随后乐观转账,回调攻击合约的pancakeCall()函数可见之前的闪电贷分析文章。

pancakecall()函数中又发起闪电贷,从Pancake LPs(0xa361433e409adac1f87cdf133127585f8a93c67d)中调用swap()函数借到424456个USDT,再次回调到pancakeCall()函数中,这是用户调用claimAllReward()函数兑换自己之前质押的奖励。

为什么在这里兑换奖励,应该很明显能够猜到是因为,闪电贷的大笔金额影响了奖励的计算方法,这里应该是计算质押奖励的函数出现了漏洞问题。

下面去PancakeSwap: Router v2 | Address 0x10ed43c718714eb63d5aa57b78b54704e256024e | BscScan项目的claimAllReward()中看一下具体源码,进行了详细的注释:

 function claimAllReward() external {
 		//判断是否存在对应的质押
        require(userInfo[msg.sender].userStakeList.length > 0, 'no stake');
        require(!black[msg.sender],'black');
        //获取质押时的,一系列质押记录,包括金额、时间戳等等
        uint[] storage list = userInfo[msg.sender].userStakeList;
        uint rew;
        uint outAmount;
        uint range = list.length;
        //计算对应的奖励
        for (uint i = 0; i < range; i++) {
            UserSlot storage info = userSlot[msg.sender][list[i - outAmount]];
            require(info.totalQuota != 0, 'wrong index');
            //不能超过一个最大奖励
            uint quota = (block.timestamp - info.claimTime) * info.rates;
            if (quota >= info.leftQuota) {
                quota = info.leftQuota;
            }
            //关键步骤,计算对应的奖励,仔细看一下getEGDPrice()函数
            //根据EGD的价格,来确定奖励多少EGD
            rew += quota * 1e18 / getEGDPrice();
            //下面是一些计算账户剩下最大奖励,以及账户余额(+利息)等操作
            info.claimTime = block.timestamp;
            info.leftQuota -= quota;
            info.claimedQuota += quota;
            if (info.leftQuota == 0) {
                userInfo[msg.sender].totalAmount -= info.totalQuota;
                delete userSlot[msg.sender][list[i - outAmount]];
                list[i - outAmount] = list[list.length - 1];
                list.pop();
                outAmount ++;
            }
        }
        //更新相应的质押列表
        userInfo[msg.sender].userStakeList = list;
        //发送响应的奖励
        EGD.transfer(msg.sender, rew);
        userInfo[msg.sender].totalClaimed += rew;
        emit Claim(msg.sender,rew);
    }
    function getEGDPrice() public view returns (uint){
    	//可在phalcon上看到行营的记录
        uint balance1 = EGD.balanceOf(pair);
        uint balance2 = U.balanceOf(pair);
        //EGD的价格仅仅是根据两种代币的实时数量(流动性)来进行计算,可以被攻击者操纵
        return (balance2 * 1e18 / balance1);
    }
    function initialize() public initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
        rate = [200, 180, 160, 140];
        startTime = block.timestamp;
        referRate = [6, 3, 1, 1, 1, 1, 1, 1, 2, 3];
        rateList = [547,493,438,383];
        dailyStakeLimit = 1000000 ether;
        wallet = 0xC8D45fF624F698FA4E745F02518f451ec4549AE8;
        fund = 0x9Ce3Aded1422A8c507DC64Ce1a0C759cf7A4289F;
        EGD = IERC20(0x202b233735bF743FA31abb8f71e641970161bF98);
        U = IERC20(0x55d398326f99059fF775485246999027B3197955);
        router = IPancakeRouter02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        pair = IPancakeFactory(router.factory()).getPair(address(EGD),address(U));
    }

EGD的价格是根据两种代币在一个地址上的数量进行计算的,我们在initialize()函数中得到pair地址,pair地址是根据router地址进行计算,router为一个代理合约,在区块链浏览器上我们可以看到pair的地址为0xa361433e409adac1f87cdf133127585f8a93c67d,为pancake的一个提供流动性的合约,是不是有点眼熟。

到这里我们也肯定发现了攻击为什么能成功?

  • 用户先通过闪电贷在Pancake LPs0xa361…中借走了大量的USDT,导致Pancake LPs中USDT与EGDpair对中,EGD的价格变得十分便宜。
  • 这时用户在pancakeCall()回调函数中,兑换奖励,奖励的计算是根据Pancake LPs中两种代币的数量进行计算EDG价格,导致EDG的价格很便宜,这是看到rew的计算公式,用户获得超额奖励。

下面简单介绍一下,phalcon上后续的调用:

先将Pancake LPs上借用的闪电贷归还;随进行了相应的k值验证(确保还款=原款+手续费)

随后在PancakeSwap: WBNB-BSC-USD 2借用的闪电贷,进行相应的approve授权

调用swapExactTokensForTokensSupportingFeeOnTransferTokens函数将得到的EGD全部兑换成USDT

随后PancakeSwap: WBNB-BSC-USD 2借用的闪电贷归还,并进行相应的k值验证

最后攻击者获利36044 USDT文章来源地址https://www.toymoban.com/news/detail-765794.html

到了这里,关于EGD价格操纵攻击事件原理分析--phalcon+etherscan的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 第67篇:美国安全公司溯源分析Solarwinds供应链攻击事件全过程

    大家好,我是ABC_123 。本期继续分享Solarwinds供应链攻击事件的第4篇文章,就是美国FireEye火眼安全公司在遭受攻击者入侵之后,是如何一步步地将史上最严重的Solarwinds供应链攻击事件溯源出来的。 注: Mandiant安全公司已被FireEye收购,但是仍然可以独立运营,严格地说的,这

    2024年02月03日
    浏览(41)
  • 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析

    1.前言 北京时间 2022 年 3 月 15 日,知道创宇区块链安全实验室监测到 Deus Finance 遭到黑客攻击,损失约 300 万美元。知道创宇区块链安全实验室 第一时间跟踪本次事件并分析。 2.基础信息 攻击者地址:0x1ed5112b32486840071b7cdd2584ded2c66198dd 攻击合约:0xb8f5c9e18abbb21dfa4329586ee74f1e2b6

    2023年04月08日
    浏览(44)
  • Android事件分发-基础原理和场景分析

    作者:京东零售 郭旭锋 和其他平台类似,Android 中 View 的布局是一个树形结构,各个 ViewGroup 和 View 是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个 View 的范围内,这样就不知道哪个 View 来响应这个事件,为了解决这一问题,就出现了事件分发机制

    2023年04月21日
    浏览(41)
  • 高级UI之Android事件分发机制原理及源码分析

    在 Android 中, 事件分发机制是一块很重要的知识点, 掌握这个机制能帮你在平时的开发中解决掉很多的 View 事件冲突问题,这个问题也是面试中问的比较多的一个问题了, 本篇就来总结下这个知识点。 Android 中页面上的 View 是以树型结构显示的,View 会重叠在一起,当我们

    2024年02月08日
    浏览(40)
  • systemserver的inputdispatcher直接产生CANCEL事件原理分析-讨厌的android触摸面试题

    上一个blog已经重点讲解了app层面自己产生的Cancel触摸事件,大概产生的原理如下: 上一个blog地址:https://blog.csdn.net/learnframework/article/details/124086882 即可以看出来,在服务端systemserver其实传递的触摸事件依然是move,只是move事件到了app端后,由于app端自己的业务把这个传递的

    2024年02月09日
    浏览(43)
  • 网络安全事件调查,如何追溯攻击者的行踪和攻击路径

    在当今互联网的世界里,网络安全已成为一个非常重要的话题。随着网络攻击的不断增加,如何保护我们的网络安全已成为一个严峻的挑战。为了防止网络攻击,需要了解攻击者的行踪和攻击路径,以便更好地预防和应对网络攻击。 网络安全事件调查是一项非常重要的工作,

    2024年02月08日
    浏览(54)
  • 盘点史上最严重的五大黑客攻击事件

    黑客攻击事件频频发生 数据安全越发重要 索尼旗下PlayStation Network平台又遭黑客入侵,数百万用户的姓名、住址、账号密码等信息遭窃。这一消息被曝光以后,科技界再次聚焦互联网安全这个异常棘手但至关重要的话题。黑客入侵电脑网络并窃取用户数据并不是什么新鲜事,

    2024年02月16日
    浏览(39)
  • 首起针对国内金融企业的开源组件投毒攻击事件

    2023年8月9日,墨菲监控到用户名为 snugglejack_org (邮件地址:SnuggleBearrxx@hotmail.com)的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量,经过确认该组件包携带远控脚本,从攻击者可控的 C2 服务器接收并执行系统命令,该组件包于2023年8月10日

    2024年02月12日
    浏览(36)
  • 低代码平台的价格范围及购买成本分析

    Zoho Creator是一款强大而灵活的低代码应用程序开发平台,可帮助企业快速、高效地创建各种应用程序。但是,很多人可能会担心它的价格问题。在这篇文章中,我们将深入探讨Zoho Creator的定价策略和计划,以帮助您更好地理解其价格结构。 首先,需要知道的是,Zoho Creator的定

    2024年02月12日
    浏览(39)
  • 【Python数据分析】二手车价格预测

    (1)读入数据 (2)分析数据格式和确定使用的模型 (3)数据预处理 (4)使用所选模型进行测试并改进 (5)应用不同算法(模型)对比效果 (6)使用集成学习算法提升回归效果 (7)网格搜索调参数 1、读取数据 这里使用在阿里巴巴天池下载的二手车交易数据https://tia

    2024年02月08日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包