{"content":{"title":"ThreeBody代币被攻击事件分析","body":"### 攻击背景\r\n\r\n攻击者地址：0xec14b00a36869da8ea3acf93fffafd12aeea9993\r\n\r\n攻击合约地址：0xd838b8b3df060163e9eca4a5757ce457b04013c8\r\n\r\n攻击tx：[https://phalcon.blocksec.com/tx/bsc/0xfcaf5a5703b926a3cd98fdc37f85b61e877b13b65ec546355ae1000f4d066e5d](https://phalcon.blocksec.com/tx/bsc/0xfcaf5a5703b926a3cd98fdc37f85b61e877b13b65ec546355ae1000f4d066e5d)\r\n\r\n### 攻击过程分析\r\n\r\n1.攻击者从dodo借出217456 USDT\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/e9ClmsFp63c65a57497ba.png)\r\n\r\n2.调用Lp合约的addLiquidity方法\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/AwPZghdy63c65a67a5d85.png)\r\n\r\n如果usdt的数量大于0.1且代币数量大于1，那么会调用router合约的addliquidity方法添加流动性。否则扣除1%fee后将剩余的代币兑换成usdt。\r\n\r\n然后将1%fee转帐给addLiquidity方法的调用者。\r\n\r\nLp合约地址共有 1 297 111 701 Three-Body，0 USDT\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/80DMrc3A63c65a8020795.png)\r\n\r\n调用addLiquidity方法，不满足if判断，因此会调用swapExactTokensForTokensSupportingFeeOnTransferTokens，将Lp合约的Three-Body扣除1%的fee后共1 284 140 584 Three-Body通过pancakeswap兑换为251 USDT\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/QfGBfVj563c65a92d6a80.png)\r\n\r\n调用代币的transfer方法将fee转帐给addLiquidity方法的调用者，这里为攻击合约。\r\n\r\nfee共12 971 117 Three-Body，Three-Body代币在转帐过程中还要收取千分之五的fee（64855 Three-Body）到Lp合约地址。然后代币总量如果小于1000000000000，调用mint方法增发fee数量的代币到Lp合约地址。\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/zrOcJWtF63c65aadc2fc2.png)\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/OuFf4ARg63c65ac727ef6.png)\r\n\r\n3.将217 436 USDT兑换成9 538 988 332 Three-Body\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/mhMO7jXV63c65ad7d54cd.png)\r\n\r\n转帐过程中收取千分之五的fee，实际收到9 538 988 332 Three-Body，其它的发送到Lp合约地址\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/7TEllthw63c65aea1b25d.png)\r\n\r\n4.将Three-Body发送到Three-Body-USDT的LP合约地址，然后调用skim将接受者地址设置为攻击合约自身，然后多次重复该过程。每次skim转帐都会收取千分之五fee到Lp合约，且增发fee数量的代币到Lp合约。通过重复调用skim可以增发很多Three-Body到Lp合约中。\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/E3tZ2WPp63c65afcacfa8.png)\r\n\r\n5.调用Lp合约的addLiquidity方法，转帐0.1 USDT多1点，多次重复该过程\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/wQkys0MW63c65b0cb60c0.png)\r\n\r\n每次转帐大于0.1 USDT的作用是让Lp合约中USDT的余额始终大于0.1，满足合约内if判断，当调用Lp合约的addLiquidity方法时，Lp合约中的Three-Body不会被兑换为USDT。而是调用router合约的addLiquidity方法添加流动性。\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/BOxE9Hrk63c65b26a5ba1.png)\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/DBrGKVFi63c65b3456ff6.png)\r\n\r\n攻击合约每次调用获得Lp合约地址代币数量的1%的fee，多次调用可以将Lp合约中的Three-Body代币都转移到攻击合约中。\r\n\r\n6.将12 645 471 858 Three-Body换成218 333 USDT\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/01/Mjs7e57f63c65b4822240.png)\r\n\r\n7.归还闪电贷217 456 USDT，攻击结束，共获利 218 333-217 456=877 USDT\r\n\r\n### 总结\r\n\r\n攻击者主要是通过多次调用skim方法触发转帐来增发Three-Body代币到Lp合约，然后通过重复以下两步操作：（1）转帐大于0.1 USDT。 （2）调用addLiquidity方法。将Lp合约中的Three-Body代币掏空。最后卖出Three-Body代币，归还闪电贷。"},"author":{"user":"https://learnblockchain.cn/people/11441","address":null},"history":null,"timestamp":1673944611,"version":1}