攻击者主要是通过多次调用skim方法触发转帐来增发Three-Body代币到Lp合约,然后通过重复以下两步操作:(1)转帐大于0.1 USDT。 (2)调用addLiquidity方法。将Lp合约中的Three-Body代币掏空。最后卖出Three-Body代币,归还闪电贷。
攻击者地址:0xec14b00a36869da8ea3acf93fffafd12aeea9993
攻击合约地址:0xd838b8b3df060163e9eca4a5757ce457b04013c8
1.攻击者从dodo借出217456 USDT
2.调用Lp合约的addLiquidity方法
如果usdt的数量大于0.1且代币数量大于1,那么会调用router合约的addliquidity方法添加流动性。否则扣除1%fee后将剩余的代币兑换成usdt。
然后将1%fee转帐给addLiquidity方法的调用者。
Lp合约地址共有 1 297 111 701 Three-Body,0 USDT
调用addLiquidity方法,不满足if判断,因此会调用swapExactTokensForTokensSupportingFeeOnTransferTokens,将Lp合约的Three-Body扣除1%的fee后共1 284 140 584 Three-Body通过pancakeswap兑换为251 USDT
调用代币的transfer方法将fee转帐给addLiquidity方法的调用者,这里为攻击合约。
fee共12 971 117 Three-Body,Three-Body代币在转帐过程中还要收取千分之五的fee(64855 Three-Body)到Lp合约地址。然后代币总量如果小于1000000000000,调用mint方法增发fee数量的代币到Lp合约地址。
3.将217 436 USDT兑换成9 538 988 332 Three-Body
转帐过程中收取千分之五的fee,实际收到9 538 988 332 Three-Body,其它的发送到Lp合约地址
4.将Three-Body发送到Three-Body-USDT的LP合约地址,然后调用skim将接受者地址设置为攻击合约自身,然后多次重复该过程。每次skim转帐都会收取千分之五fee到Lp合约,且增发fee数量的代币到Lp合约。通过重复调用skim可以增发很多Three-Body到Lp合约中。
5.调用Lp合约的addLiquidity方法,转帐0.1 USDT多1点,多次重复该过程
每次转帐大于0.1 USDT的作用是让Lp合约中USDT的余额始终大于0.1,满足合约内if判断,当调用Lp合约的addLiquidity方法时,Lp合约中的Three-Body不会被兑换为USDT。而是调用router合约的addLiquidity方法添加流动性。
攻击合约每次调用获得Lp合约地址代币数量的1%的fee,多次调用可以将Lp合约中的Three-Body代币都转移到攻击合约中。
6.将12 645 471 858 Three-Body换成218 333 USDT
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代币,归还闪电贷。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!