Прохождение испытания Fallback от Ethernaut CTF с использованием Foundry.

Посмотрите внимательно на код контракта ниже.

Вы пройдете этот уровень, если:

1. Вы заявляете право собственности на контракт

2. Вы уменьшаете его баланс до 0.

Состояние контракта

Первая переменная хранения этого сопоставления с общедоступной видимостью, которая ожидает адрес и возвращает uint256. Следующая переменная хранения, которая займет первый слот хранения для контракта, — это общедоступный владелец.

Конструктор

Конструктор для этого контракта очень прост и устанавливает развертывателя в качестве владельца контракта и устанавливает вклад для развертывателя в 1000 ETH.

тольковладелец

Модификатор, гарантирующий, что владельцем контракта, как указано в состоянии контракта, является тот, кто вызывает функцию.

способствовать

Функция вклада — это общедоступная функция, которая также подлежит оплате, то есть мы можем ожидать, что с этой функцией произойдет некоторая передача значения. Первая строка функции проверяет, чтобы количество эфира, отправленного с вызовом функции, было ниже определенного порога, в данном случае 0,001 эфира. Если отправитель отправляет сумму ниже порогового значения, сопоставление взносов берет адрес отправителя и обновляет сумму его взноса на сумму отправленного.

Если взносы какой-либо конкретной учетной записи когда-либо превысят вклады текущего владельца контракта, сделайте отправителя новым владельцем контракта. Таким образом, здесь явно есть способ стать владельцем контракта, но это будет стоить больших денег и будет очень медленным.

получитьвклады

Функция getContribution — это общедоступная функция, которая не изменяет или иным образом не пытается манипулировать состоянием контракта. Функция вернет баланс отправителя, вызвавшего функцию.

отзывать

Функция отзыва будет функцией, которую может вызвать любой, но она будет иметь модификатор onlyOwner, чтобы гарантировать, что тот, кто вызывает функцию отзыва, на самом деле является владельцем контракта. Если эта проверка проходит, мы входим в функцию. Адрес владельца контракта будет преобразован в платежный адрес, и будет вызвана функция перевода для перевода всей суммы, хранящейся в этом контракте, владельцу/отправителю.

получать

Функция получения является резервной функцией контракта и определена для вызова только внешними контрактами и потенциально будет принимать входящие средства для контракта. Резервная функция Solidity выполняется, если ни одна из других функций не соответствует идентификатору функции или при вызове функции не были предоставлены данные. Контракту может быть назначена только одна безымянная функция, и она выполняется всякий раз, когда контракт получает простой эфир без каких-либо данных. Чтобы получить эфир и добавить его к общему балансу контракта, резервная функция должна быть помечена как подлежащая оплате. Если такой функции не существует, контракт не может получать эфир посредством обычных транзакций и выдает исключение.

Подвиг

В конечном счете, мы хотим полностью слить контракт. Для этого нам нужно вызвать функцию снятия, а для успешного входа в функцию нам нужно будет получить контроль над контрактом. Здесь есть два пути сделать это.

Мы можем сделать это так, как предполагалось, и потратить более 1000 ETH, чтобы наши вклады в конечном итоге перевешивали развёртывателя, или мы можем каким-то образом активировать резервную функцию после внесения вклада, чтобы мы получили право собственности на контракт. После этого мы можем вызвать функцию изъятия и QED.

Это означает, что если мы просто вызовем низкоуровневый вызов передачи и укажем этот адрес контракта в качестве предполагаемого получателя (и мы не прикрепим никаких данных, кроме отправки ETH), мы активируем резервную функцию. Запуск резервной функции приведет к проверке, которая подтверждает, что мы отправляем ненулевое положительное количество ETH с этим вызовом и что отправитель также внес предварительный вклад в резервный контракт. Если этот чек очищен, право собственности на контракт будет передано отправителю.

Новичок в трейдинге? Попробуйте криптотрейдинговые боты или копи-трейдинг на лучших криптобиржах

Присоединяйтесь к Coinmonks Telegram Channel и Youtube Channel и получайте ежедневные Крипто новости

Также читайте