September 13, 2021

Как взламывали сейл Пломбира. Каждый мог

Тут я расскажу как был устроен смарт контракт и почему "надо было просто нанять кодеров" не работает. Надо было нанять хороших кодеров

Сама информация о контракте появилась часа за 2 до начала, а с учетом переноса, часов за 5. Просто был трансфер 16kk $GEL и стало понятно куда.

Когда мы узнали адрес контракта стало возможно прочитать, что он позволяет делать, прямо в etherscan.

В нашем случае надо работать не с контрактом а с тем что "под" ним.

Видно много-много точек взаимодействия с контрактом, все они явно имеют названия связанные с сейлом. Но нас интересует конечно же buyDolphin

"Дальше дело техники - жмем Connect to web3 и взаимодействуем, токен наш!". Так говорят нам знатоки.

А что писать в поле signature?

На этом простой учебник о взаимодействии со смарт-контрактами заканчивается и начинается методичка по криптографии.

Помочь ответить на вопрос что такое signature мне смог другой метод isDolphin. Он тоже принимает на вход этот аргумент но для работы с ним не нужно платить комиссии.

Посмотрим код базового контракта:

Эта функция проверяет, дельфин ли вы. Для этого мы проверяем, что signer - это тот, кто подписал ваш адрес и получил в результате signature. Другими словами, на их стороне, в процессе подготовки контракта, ими был создан signer. Он для каждого из ключей в whitelist создал signature, причем таким образом, что имея адрес ключа и signature можно проверить что signature создана signer-ом. Если ты не signer, то создать такую же ты не можешь. Только проверить.

Сама идея sorbet платформы в том, что signature становится известной строго в указанное время. И только после этого, предоставляя правильный signature, мы можем вызывать методы контракта. Можно ли было узнать signature до начала сейла? И вот тут кроется главный фейл сегодняшнего дня. Кажется, что можно было. Если вы видели, что ваш статус ОК, и вы в вайтлисте и дельфин, значит вы уже провзаимодействовали с контрактом.

Chrome Web-Developer tools на странице показываем нам нашу сигнатуру

То есть уже можно было кидать транзакции на покупку. И вот даже есть один кандидат, сделавший все довольно заранее. Подставляя его адрес и сигнатуру видим, что он все понял.

Собственно, исходя из этого можно понять что те, кто уделил час времени такому анализу вполне могли войти в блоки первыми сделав вид что входят за первые 2 секунды, готовясь на самом деле заблаговременно. Да же?

Ну и напоследок простой контракт чтобы продемонстрировать как работает signature. Разработал его в remix по-быстрому.

Подставляем вот такие параметры

{ "address _address": "0x7D852B24Ea94504F03743289131034bFb5DB954d", "bytes signature": "0xf14c4b5004d205155cb1a722b4e0424decd4f89f82e4bc70020f12db16312edf32042e759d978cdbb5c9cbd713d777e0dff4d96917c2f370d06f73d8da1a17d51c" }

получаем вычисленный адрес signer { "0": "address: 0x1aF41728737f8bC40E9eA1a9E1A3b19F4Db3Bdf9" }. Это собственно адрес разработчика контракта GEL.

Полезное знание.

Пишите если думаете что мы можем сотрудничать. [email protected]