pancake闪电贷攻击学习

这篇具有很好参考价值的文章主要介绍了pancake闪电贷攻击学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

合约地址:
BunnyMinterV2:https://bscscan.com/address/0x819eea71d3f93bb604816f1797d4828c90219b5d#code
VaultFlipToFlip:https://bscscan.com/address/0xd415e6caa8af7cc17b7abd872a42d5f2c90838ea#code
MasterChefh:https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e#code
pancakePair:https://bscscan.com/address/0x16b9a82891338f9ba80e2d6970fdda79d1eb0dae#code
PancakeRouter:https://bscscan.com/address/0x10ED43C718714eb63d5aA57B78B54704E256024E#code
攻击交易:
一:https://bscscan.com/tx/0x88fcffc3256faac76cde4bbd0df6ea3603b1438a5a0409b2e2b91e7c2ba3371a
二:https://bscscan.com/tx/0x897c2de73dd55d7701e1b69ffb3a17b0f4801ced88b0c75fe1551c5fcce6a979
参考文章:
PancakeBunny攻击事件复盘分析 | 零时科技:http://www.xilian.link/depth/75435.html
慢雾:PancakeBunny 黑客分析:
https://slowmist.medium.com/slowmist-pancakebunny-hack-analysis-4a708e284693


合约BunnyMinterv2中函数mintForV2通过performanceFee与valueInBNB 计算mint生成的数量。

		uint performanceFee = canMint() ? _minter.performanceFee(amount) : 0;        
        if (performanceFee > DUST) {
            _minter.mintForV2(address(_stakingToken), 0, performanceFee, msg.sender, depositTimestamp);
            amount = amount.sub(performanceFee);
        }
function mintForV2(address asset, uint _withdrawalFee, uint _performanceFee, address to, uint) external payable override onlyMinter {
        uint feeSum = _performanceFee.add(_withdrawalFee);  
        _transferAsset(asset, feeSum);
        if (asset == BUNNY) {
            IBEP20(BUNNY).safeTransfer(DEAD, feeSum);
            return;
        }
        uint bunnyBNBAmount = _zapAssetsToBunnyBNB(asset, feeSum, true);
        if (bunnyBNBAmount == 0) return;

        IBEP20(BUNNY_BNB).safeTransfer(BUNNY_POOL, bunnyBNBAmount);
        IStakingRewards(BUNNY_POOL).notifyRewardAmount(bunnyBNBAmount);

        (uint valueInBNB,) = priceCalculator.valueOfAsset(BUNNY_BNB, bunnyBNBAmount);
        uint contribution = valueInBNB.mul(_performanceFee).div(feeSum);
        uint mintBunny = amountBunnyToMint(contribution);
        if (mintBunny == 0) return;
        _mint(mintBunny, to);
    }

但在函数_zapAssetsToBunnyBNB返回的bunnyBNBAmount数量是由IBEP20(BUNNY_BNB).balanceOf(address(this)).sub(_initBunnyBNBAmount)操作后减操作前的balance计算出来的。
同时中间有removeLiquidity操作。
再看removeLiquidity代码:

function removeLiquidity()
......
address pair = PancakeLibrary.pairFor(factory, tokenA, tokenB);
        IPancakePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IPancakePair(pair).burn(to);
.............
 
------------
function burn(address to) external lock returns (uint amount0, uint amount1) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];
        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; 
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1); 

再调用burn时会将当前pair中的lptoken全部燃烧并发送相应的token到目标地址。
如果将lptoken提前存入pair中,那么在调用函数_zapAssetsToBunnyBNB时因为removeLiquidity的操作,会将提前存入的lptoken也一并转换为token并发送回合约,大量bnb与usdt 来到合约后。
zapInToken又将这些token转换为bnb后再(转换一半数量为bunny。一半bnb)1:1存入bunny:bnb池子,增加池子中bnb数量(影响bunny价格),_zapAssetsToBunnyBNB返回时因为提前存入lp导致返回的 bunnyBNBAmount 数量也异常的大。
(uint valueInBNB,) = priceCalculator.valueOfAsset(BUNNY_BNB, bunnyBNBAmount);时因为zapInToken的操作,导致计算的valueInBNB结果也变得非常高。
最终生成了大量bunnytoken。文章来源地址https://www.toymoban.com/news/detail-416184.html

到了这里,关于pancake闪电贷攻击学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Solidity智能合约安全指南:预防已知攻击的关键.

    账户类型 创建成本 交易发起 使用场景 作用 外部账户(私钥的所有者控制) 创建账户是免费的 可以自主发起交易 外部所有的账户之间只能进行ETH和代币交易 1、接受、持有和发送ETH 和 token 2、与已部署的智能合约进行交互 合约账户(由代码控制,部署在网络上的智能合约

    2024年02月12日
    浏览(54)
  • 一个以太坊合约的漏洞分析-重入攻击

    请找出下列合约漏洞,并说明如何盗取ContractB 中的数字资产,并修复合约。中说明:ContractB 的contract_a接口为ContractA 地址 这段 Solidity 代码中存在一个关键的漏洞,允许攻击者在 ContractB 中盗取数字资产。攻击者可以利用 withdrawFunds 函数中的漏洞来实现攻击,让我们一步步分

    2024年02月11日
    浏览(46)
  • 智能合约安全,著名的区块链漏洞:双花攻击

    区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。 但是,与任何技术一样,它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。 在本文中,我们将深入研究双花攻击的复杂性,探讨其工作原理、开发方法、预防措施及其对区块链生态系统的影响。 区

    2024年02月04日
    浏览(57)
  • 调用合约方法创建子合约后获取子合约地址

    在通过调用合约的方法创建合约后,不能直接得到子合约地址。不便于单元测试。如下方法可解决: 合约: 单元测试:

    2024年02月15日
    浏览(37)
  • 区块链合约安全系列(三):如何认识及预防公链合约中的自毁攻击

    id:BSN_2021 公众号:BSN 研习社 作者:红枣科技张雪良 背景:由于公链环境下所有的信息都是共享的,智能合约相当于是完全透明化,任何人都可以调用,外加一些利益的驱动,导致引发了很多hacker的攻击。其中self destruct攻击也是常见的攻击方式之一。 目标:将目标合约瘫痪

    2024年02月01日
    浏览(42)
  • 智能合约安全分析,假充值攻击如何突破交易所的防御?

    引言 假充值攻击,是指攻击者通过利用交易所在处理充值过程中的漏洞或系统错误,发送伪造的交易信息到交易所钱包地址,这些伪造的交易信息被交易所误认为是真实的充值请求,并将对应的数字资产或货币添加到攻击者的账户中。攻击者利用这种方式,可以获得未经支付

    2024年02月09日
    浏览(48)
  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(49)
  • 以太坊合约地址计算

    前序博客有: 以太坊proxy合约 以太坊合约实现中,为实现可升级性、地址一致性、state和data 与 合约逻辑 分离,proxy承担了重要的角色。在proxy合约中,合约部署主要采用过 CREATE(0xf0) 和 CREATE2(0xf5) opcode。 以太坊创建合约的方式有2种: 1)由EOA账号直接创建合约 2)由其它智能

    2024年02月02日
    浏览(37)
  • 如何在不同链部署地址完全相同的合约

    在以太坊中,合约是一种特殊的账户,它没有私钥,只有代码。而合约的地址通常是由部署者的地址与nonce共同做keccak哈希生成的。具体的算法实际上就是: 对于那些需要在多个链部署的项目来说,如果保证部署者的地址相同,nonce相同,则可以部署出相同地址的合约。例如

    2024年02月01日
    浏览(33)
  • 一起学solidity写智能合约——地址类型(address)

    在区块链中说地址重不重要,其实会被笑,然后会让你去恶补一下知识点,哈哈哈哈哈哈,地址可以没有区块链,但是区块链不能没有地址,这句话不是开玩笑。 地址类型是在以太坊的诞生之后出现的一个特有类型,他是一个大小160位的二进制数字 在地址中我们可以说有很

    2023年04月16日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包