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
Post #434
179