# defihack.xyz ## 1. May The Force Be With You Цель: - Забрать все токены YODA с смартконтракта ### Анализ В коде представлены две сущности: - MayTheForceBeWithYou (inherited from ERC20, ReentrancyGuard) - MiniMeToken (inherited from Ownable) Обе сущности - токены. Однако MayTheForceBeWithYou (xYODA) релизует надстройку над MiniMeToken (YODA). При вызове deposit() xYODA выполняется странный кусок кода: ```solidity function deposit(uint256 amount) external nonReentrant { ... // If no xYODA exists, mint it 1:1 to the amount put in if (totalShares == 0 || totalYoda == 0) { _mint(msg.sender, amount); } ... } ``` Если у того кто вызывает эту функцию нет YODA на балансе (или totalShares == 0), то ему выдаётся то количество xYODA, которое он запрашивает. Вероятно, это условие должно было выглядеть как `totalShares == 0 && totalYoda == 0` - т.е. тут логическая ошибка, которая позволяет нам получить любое количество xYODA. Так как после этого мы получаем токены xYODA, то используя функцию withdraw мы можем вызвести токены YODA со смартконтракта. ## 3. P2PSwapper Цель: - Увести все WETH полученные как комиссии за транзакции ### Анализ В коде представлены две сущности: - P2P_WETH (токен, который используется для комиссии) - P2PSwapper (обменик) P2PSwapper реализует работу со сделками. Схематично сделку через этот контракт можно представить следующим образом: ```mermaid sequenceDiagram actor User1 participant P2PSwapper actor User2 rect rgb(191, 223, 255) User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount) User1-->>P2PSwapper: fee User1-->>P2PSwapper: bidToken end rect rgb(200, 150, 255) User2->>P2PSwapper: takeDeal(dealId) User2-->>User1: askToken P2PSwapper-->>User2: bidToken end ``` Отмена сделки будет выглядеть следующим образом: ```mermaid sequenceDiagram actor User1 participant P2PSwapper rect rgb(191, 223, 255) User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount) User1-->>P2PSwapper: fee User1-->>P2PSwapper: bidToken end rect rgb(200, 150, 255) User1->>P2PSwapper: cancelDeal(dealId) P2PSwapper-->>User1: bidToken end ``` Однако нет никакой проверки, была ли сделка уже отменена. Поэтому мы можем отменить сделку два и более раз, выводя любое количество bidToken со смартконтракта: ```mermaid sequenceDiagram actor User1 participant P2PSwapper rect rgb(191, 223, 255) User1->>P2PSwapper: createDeal(bidToken, bidPrice, askToken, askAmount) User1-->>P2PSwapper: fee User1-->>P2PSwapper: bidToken end rect rgb(200, 150, 255) User1->>P2PSwapper: cancelDeal(dealId) P2PSwapper-->>User1: bidToken end rect rgb(200, 150, 255) User1->>P2PSwapper: cancelDeal(dealId) P2PSwapper-->>User1: bidToken end rect rgb(200, 150, 255) User1->>P2PSwapper: cancelDeal(dealId) P2PSwapper-->>User1: bidToken end rect rgb(200, 150, 255) User1->>P2PSwapper: cancelDeal(dealId) P2PSwapper-->>User1: bidToken end ``` Код эксплойтов на гитхаб: - https://github.com/ArturLukianov/defihack-solutions/blob/main/scripts/exploit-1.js - https://github.com/ArturLukianov/defihack-solutions/blob/main/scripts/exploit-3.js