September 29, 2023

Решение задач Ethernaut. Reentrance 

Задача:

  1. опустошить контракт

Изучив контракт мы видим что стейт контракта изменяется после передачи эфира через call().

Мы можем перехватить поток выполнения контракта если реализуем у атакующего контракта функцию receive(), которая вызовется при получении эфира. И т.к. контракт с уязвимостью еще не изменил наш баланс, то мы можем вызвать повторно функцию withdraw()

Напишем контракт, с помощью которого мы сможем воспользоваться уязвимостью повторного входа в контракт и рассмотрим поток исполнения

  1. Сначала донатим немного эфира, для того что бы выполнить условие из первой строки функии withdraw()
  2. Запрашиваем снятие эфира
  3. Повторно запрашиваем снятие эфира после получения эфира на наш контракт
  4. Выполняем в цикле снятие и запрос до того момента пока атакуемый контракт не опустеет