Я новичок в безопасности ICO и смарт-контрактов. Пытаемся найти баги в проверенных контрактах. Кажется, я обнаружил некоторые проблемы в адресе 0x42dB5Bfe8828f12F164586AF8A992B3a7B038164, но я не знаю, как их вывести. Нужно ли мне создавать транзакцию самостоятельно?
Ха-ха - очень подлый.
Всем, у кого возникнет соблазн испортить этот контракт , т. е. воспользоваться очевидным недостатком: вы, скорее всего, потеряете свой эфир.
Далее следует объяснение.
Похоже, в withdrawal()
функции есть довольно заманчивая уязвимость: когда вы отправляете функции больше, чем Limit
Wei, она отправит вам весь баланс контракта — сумму, которую вы отправили, плюс 0,36 Eth, которые уже есть. Мгновенная прибыль!
Однако есть эта невинно выглядящая, но тем не менее свойственная delegatecall
функция logEvent()
в другом договоре. Короче говоря, это не регистрирует событие. На самом деле он незаметно изменяет значение adr
переменной хранилища, чтобы оно больше не указывало на msg.sender
. Таким образом, баланс контракта не будет возвращен вам по adr.send(this.balance)
звонку, он будет отправлен куда-то еще, так adr
как больше не равен msg.sender
.
Это немного запутано, но похоже, что делегированный вызов email.logEvent()
функции контракта приводит adr
к установке на собственный адрес контракта: т.е. он отправляет весь Эфир (включая тот, который вы отправили) себе. Только владелец контракта (0x46Feeb381e90f7e30635B4F33CE3F6fA8EA6ed9b) может вывести Eth.
email
контракт, находится здесь . Просто скопируйте и вставьте байт-код в любой инструмент развертывания, который вы используете. Затем вам нужно изменить адрес в другом контракте, чтобы он указывал на новый адрес email
. Я использую написанный мной декомпилятор и много рисую на клочках бумаги для анализа. Ремикс хорош, если есть существующий Tx для трассировки, но в этом случае его не было.
Ричард Хоррокс
Уилджгрифф