Эксплойт при помощи gasLeft()
Сегодня мы будем разбираться с эксплойтом через gasLeft()
Предисловие
Недавно наткнулся на сниппет контракта и комментарий к нему "попробуйте уменьшить значение в переменной price"
Некоторое время я подумал, но мне в голову вообще не приходило решение, поэтому пришлось искать ответ в интернете, но найдя его, я все еще не понимал как оно эксплойтится, поэтому пришлось делать дип дайв
После дебага и проверки gasLeft после каждого опокода - я увидел логику, и она оказалось гипер простой и очевидной
Решение
Функция gasLeft берет количество оставшегося газа в момент, когда эта сама функция вызывается, то есть gasLeft в начале транзакции будет больше, чем gasLeft в конце транзакции, так как между ними были вызваны некоторые опкоды, которые использовали газ
На примере контракта выше я постараюсь максимально просто обьяснить это
В данной строке gasLeft будет больше чем 35000, соответственно при вызове будет возвращено 101, из условия ниже
Далее будет произведена еще некоторая логика, например еще одна проверка, которая подъест некоторое количество газа, тем самым на этом этапе
Наш gasLeft будет уже меньше 35000, соответственно в переменную price будет возвращено 0, из условия выше
В итоге мы получаем значение 0 в переменной price и готовый эксплойт!
Будьте аккуратнее при написании контрактов
Надеюсь статья была интересной и понятной!