ThreeBody代币被攻击事件分析

  • Drac
  • 更新于 2023-01-17 16:36
  • 阅读 266

攻击者主要是通过多次调用skim方法触发转帐来增发Three-Body代币到Lp合约,然后通过重复以下两步操作:(1)转帐大于0.1 USDT。 (2)调用addLiquidity方法。将Lp合约中的Three-Body代币掏空。最后卖出Three-Body代币,归还闪电贷。

攻击背景

攻击者地址:0xec14b00a36869da8ea3acf93fffafd12aeea9993

攻击合约地址:0xd838b8b3df060163e9eca4a5757ce457b04013c8

攻击tx:https://phalcon.blocksec.com/tx/bsc/0xfcaf5a5703b926a3cd98fdc37f85b61e877b13b65ec546355ae1000f4d066e5d

攻击过程分析

1.攻击者从dodo借出217456 USDT

image.png

2.调用Lp合约的addLiquidity方法

image.png

如果usdt的数量大于0.1且代币数量大于1,那么会调用router合约的addliquidity方法添加流动性。否则扣除1%fee后将剩余的代币兑换成usdt。

然后将1%fee转帐给addLiquidity方法的调用者。

Lp合约地址共有 1 297 111 701 Three-Body,0 USDT

image.png

调用addLiquidity方法,不满足if判断,因此会调用swapExactTokensForTokensSupportingFeeOnTransferTokens,将Lp合约的Three-Body扣除1%的fee后共1 284 140 584 Three-Body通过pancakeswap兑换为251 USDT

image.png

调用代币的transfer方法将fee转帐给addLiquidity方法的调用者,这里为攻击合约。

fee共12 971 117 Three-Body,Three-Body代币在转帐过程中还要收取千分之五的fee(64855 Three-Body)到Lp合约地址。然后代币总量如果小于1000000000000,调用mint方法增发fee数量的代币到Lp合约地址。

image.png

image.png

3.将217 436 USDT兑换成9 538 988 332 Three-Body

image.png

转帐过程中收取千分之五的fee,实际收到9 538 988 332 Three-Body,其它的发送到Lp合约地址

image.png

4.将Three-Body发送到Three-Body-USDT的LP合约地址,然后调用skim将接受者地址设置为攻击合约自身,然后多次重复该过程。每次skim转帐都会收取千分之五fee到Lp合约,且增发fee数量的代币到Lp合约。通过重复调用skim可以增发很多Three-Body到Lp合约中。

image.png

5.调用Lp合约的addLiquidity方法,转帐0.1 USDT多1点,多次重复该过程

image.png

每次转帐大于0.1 USDT的作用是让Lp合约中USDT的余额始终大于0.1,满足合约内if判断,当调用Lp合约的addLiquidity方法时,Lp合约中的Three-Body不会被兑换为USDT。而是调用router合约的addLiquidity方法添加流动性。

image.png

image.png

攻击合约每次调用获得Lp合约地址代币数量的1%的fee,多次调用可以将Lp合约中的Three-Body代币都转移到攻击合约中。

6.将12 645 471 858 Three-Body换成218 333 USDT

image.png

7.归还闪电贷217 456 USDT,攻击结束,共获利 218 333-217 456=877 USDT

总结

攻击者主要是通过多次调用skim方法触发转帐来增发Three-Body代币到Lp合约,然后通过重复以下两步操作:(1)转帐大于0.1 USDT。 (2)调用addLiquidity方法。将Lp合约中的Three-Body代币掏空。最后卖出Three-Body代币,归还闪电贷。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Drac

5 篇文章, 75 学分