{"content":{"title":"SushiBar重入事件分析","body":"# 1、SushiBar重入事件简介\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2022/10/ASJ9Uob4635dd8fb2c3ce.png)\r\n# 2、攻击分析\r\n交易：https://phalcon.blocksec.com/tx/eth/0x8037b3dc0bf9d5d396c10506824096afb8125ea96ada011d35faa89fa3893aea\r\n# 3、获利分析\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2022/10/dlEwelaS635dd9e52aec7.png)\r\n每次获利分析：\r\nhttps://etherscan.io/tx/0x8037b3dc0bf9d5d396c10506824096afb8125ea96ada011d35faa89fa3893aea\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2022/10/gc8z3VfR635dda002f92d.png)\r\n# 4、攻击过程分析\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2022/10/tBj8cNys635dda23e22b1.png)\r\n1、攻击合约先通过ERC1820注册发送代币回调接口keccak256(\"ERC777TokensSender\")=0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895 \r\n2、通过SLP 闪电贷获取资金\r\n3、攻击合约调用Xn00d合约的enter函数存入资金\r\n4、因为n00d合约是ERC777合约，在调用transferFrom转移代币时会调用发送者的回调函数tokensToSend ，攻击合约在该函数中又重新调用n00d合约的enter函数再次存入，此时上一次transferFrom 转移代币还未完成\r\n5、攻击合约再次通过回调函数调用enter函数（每轮3次递归调用）\r\n# 5、漏洞原因\r\n漏洞原因：\r\n1、每次调用 _mint 函数都会增加 _totalSupply的值\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2022/10/s7De1j4m635dda679e5ba.png)\r\n2、漏洞合约先使用 _mint函数先增加了totalSupply的值，再使用transferFrom函数进行转账，而ERC777合约会先调用发送者的tokentosend函数，使得重入发生。而根据公式\r\nuint256 what = _amount.mul(totalShares).div(totalSushi);\r\n使得转给攻击者的代币数量（what）明显增加\r\n\r\n![6.png](https://img.learnblockchain.cn/attachments/2022/10/rnW1qWcI635dda7f28e56.png)"},"author":{"user":"https://learnblockchain.cn/people/10579","address":null},"history":null,"timestamp":1667095324,"version":1}