October 10, 2023

Решение задач MrStealYoCrypto. Jpeg Sniper

https://mrstealyocrypto.xyz/jpeg-sniper/index.html

NFT маркетплейс занимается публичной продажей коллекции и выпускает новую коллекцию.

Задача:

  • Выкупить всю NFT коллекцию за одну транзакцию.

Изучив контракт маркетплейса видим, что в функции публичной продажи стоит модификатор isEOA, который говорит, что функцию может вызвать только пользователь, а не контракт.

Взглянем на код модификатора. С первого взгляда кается, что все правильно:

Если размер кода по адресу не ноль, то это контракт и запрещаем работу

Но проблема этого решения заключается в том, что размер равен нулю пока выполняется конструктор контракта и только после полного выполнения конструктора становится больше нуля.

Давайте немного разберем атаку:

1. Что бы обойти ограничение модификатора isEOA - напишем код атаки на маркетплейс в конструкторе контракта:В уязвимой функции так же существуют дополнительные ограничения:

2. Для минта NFT на атакающем адресе не должно быть больше NFT чем maxPerAddressDuringMint

Что бы обойти это ограничение мы можем перевести сминченные NFT на другой адрес, что бы текущий баланс снова стал равен нулю.

3. Следующее ограничение проверяет, что мы не можем сминтить больше NFT чем есть в коллекции

Это ограничение обходистя с помощью изменения количества запрашиваемых токенов для минта - _quentity

Ниже привиден код, для осуществления задуманной атаки на маркетплейс

Атака начнется во время развертывания контракта. В качестве параметра передаем адрес маркетплейса

Задача решена