Решение задач AMAZEX-DSS-PARIS. ModernWETH
https://github.com/secureum/AMAZEX-DSS-PARIS/tree/main/src/2_ModernWETH
Создан ERC20 контракт, который оборачивает эфир. На нем находится 1000 ETH
Изучив код контракта, замечаем что в функции withdrawAll на 33 и 36 строке проверяется текущее количество токенов.
Уязвимость заключается в том, что при вызове call'а исполнение передается в другой контракт (если msg.sender это контракт) и баланс токенов может быть изменен там.
Воспользуемся данной уязвимостью что бы опустошить ModernWETH.
Создадим 2 контракта: 1й будет использовать данную уязвимость, 2й будет служить временным хранилищем токенов.
Теперь разберем алгоритм атаки
В цикле постоянно увеличивается количество эфиров, которые мы депозитим. Что бы избежать revert'а когда мы пытаемся снять эфира больше чем есть на контракте мы проверяем сколько эфиров осталось на контракте.
Теперь создадим атакующий контракт и вызовем функцию атаки