September 29, 2023
Решение задач Ethernaut. Reentrance
Изучив контракт мы видим что стейт контракта изменяется после передачи эфира через call().
Мы можем перехватить поток выполнения контракта если реализуем у атакующего контракта функцию receive(), которая вызовется при получении эфира. И т.к. контракт с уязвимостью еще не изменил наш баланс, то мы можем вызвать повторно функцию withdraw()
Напишем контракт, с помощью которого мы сможем воспользоваться уязвимостью повторного входа в контракт и рассмотрим поток исполнения
- Сначала донатим немного эфира, для того что бы выполнить условие из первой строки функии withdraw()
- Запрашиваем снятие эфира
- Повторно запрашиваем снятие эфира после получения эфира на наш контракт
- Выполняем в цикле снятие и запрос до того момента пока атакуемый контракт не опустеет