TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.47K subscribers
Post #434 179
Ethernaut. Задачи 22-23

Я объединил эти две задачи в один пост, так как они практически идентичны. Более того, для первой задачи даже не нужно писать никакого кода.

Dex

В этой задаче нам нужно заполучить все токены с одного адреса.
Ссылка на задачу

В чем суть?

Вся соль тут заключается в расчете количества токенов для обмена, а точнее в функции getSwapPrice().

Как мы уже знаем, что в Solidity большие проблемы с корректным делением чисел: если получается число с запятой, то округление идет в меньшую сторону. Например, при 3 / 2 результат будет равен 1.

Все что нам нужно делать тут, так это постоянно обменивать все токены с одного адреса на токены с другого. В итоге, через 6-7 итераций мы получим все токены с желаемого адреса.

Dex two

В этой задаче нам нужно получить токены с обоих адресов.

Ссылка на задачу

В чем суть?

Задача чуть посложнее первой, но суть примерно таже: аккуратнее с расчетами. Тестировать их нужно как можно прицельнее.

В этой задаче исключается всего одна строка из функции swap(), а точнее:

require((from == token1 && to == token2) || (from == token2 && to == token1), "Invalid tokens");

Это именно та проверка, которая исключает использование сторонних токенов внутри swap(). Теперь же, мы можем обмануть контракт, всего лишь создав фейковый токен.

Мы создаем два поддельных токена, чтобы украсть два реальных, с помощью простой функции:

SwappableTokenTwo fakeToken1 = new SwappableTokenTwo(address(dexTwo), "Fake_token 1", "fk1", 1000);

И даем Dex Two approve() на их использование и переводы.

Затем нужно подумать, сколько токенов нам потребуется для снятия всех реальных токенов. Вернемся к расчетам в функции  getSwapAmount():

amount * tokenTo / tokenFrom

Мы хотим получить все 100 токенов, а значит:

100 token1 = amount * 100 / from

Из этого получается, что нам достаточно использовать 1 фейковый токен, чтобы получить 100 настоящих.

Для этого сначала перебрасываем наш 1 токен на Dex Two:

ERC20(fakeToken1).transfer(address(dexTwo), 1);

А затем вызываем функцию swap():

dexTwo.swap(address(fakeToken1), address(token1), 1);

И мы получаем все реальные токены в обмен на 1 фейковый.

Конечно, на настоящих биржах все уже знают о подобных делениях и используют очень сложные расчеты для обмена токенов. Тем не менее, взломы продолжают иметь место.

#ethernaut
More from @solidityset
  1. Oct 8, 2026Промо видео для SaaS и других ваших проектов Хочу поделить с вами одним из своих открытий…
  2. Oct 8, 2026video post
  3. Oct 2, 2026Вторая сложность — как доказать, что установилось именно опубликованное. В первом варианте…
  4. Oct 2, 2026Задача с полуоткрытым кодом На днях, в процессе создания одного приложения, столкнулся с и…
  5. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  6. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →