Ethernaut. Задача 9. King
В этой задаче нам предлагают, как я понял, сломать логику игры, чтобы мы остались последним королем.
Ссылка на задачу
В чем суть?
Здесь секрет кроется в king.transfer(msg.value), т.е. в одной транзакции отправляются деньги королю, и только потом идет обновление переменных короля и баланса.
Сделав так, чтобы можно было отправить деньги на контракт, но не получить выигрыш, мы фактически заблокируем его.
Решением было бы разделить эту логику и позволить текущему королю выводить деньги вручную.
Простой код для этого:
contract Hack {
function hack( address _king) external payable {
_king.call{value:msg.value}("");
}
}
Я думал, что можно решить эту задачу с selfdestruct, как в одном из примеров выше, но это не сработало. Деньги то не балансе контракта King появились, а вот переменная prize не обновилась. А все потому, что мы закинули деньги без вызова каких-либо функций, поэтому receive не сработала.
#ethernaut
Post #393
190