Решение задач MrStealYoCrypto. Jpeg Sniper
https://mrstealyocrypto.xyz/jpeg-sniper/index.html
NFT маркетплейс занимается публичной продажей коллекции и выпускает новую коллекцию.
Изучив контракт маркетплейса видим, что в функции публичной продажи стоит модификатор isEOA, который говорит, что функцию может вызвать только пользователь, а не контракт.
Взглянем на код модификатора. С первого взгляда кается, что все правильно:
Если размер кода по адресу не ноль, то это контракт и запрещаем работу
Но проблема этого решения заключается в том, что размер равен нулю пока выполняется конструктор контракта и только после полного выполнения конструктора становится больше нуля.
Давайте немного разберем атаку:
1. Что бы обойти ограничение модификатора isEOA - напишем код атаки на маркетплейс в конструкторе контракта:В уязвимой функции так же существуют дополнительные ограничения:
2. Для минта NFT на атакающем адресе не должно быть больше NFT чем maxPerAddressDuringMint
Что бы обойти это ограничение мы можем перевести сминченные NFT на другой адрес, что бы текущий баланс снова стал равен нулю.
3. Следующее ограничение проверяет, что мы не можем сминтить больше NFT чем есть в коллекции
Это ограничение обходистя с помощью изменения количества запрашиваемых токенов для минта - _quentity
Ниже привиден код, для осуществления задуманной атаки на маркетплейс
Атака начнется во время развертывания контракта. В качестве параметра передаем адрес маркетплейса