В январе 2026 года из смарт-контракта Truebit вывели 8535 ETH — около 26 миллионов долларов. Ошибка в расчёте цены позволила атакующему минтить токены почти бесплатно. Токен TRU упал более чем на 99% за несколько часов.
Контракт развернули в 2021 году и так и не верифицировали на Etherscan. Авторы не загрузили исходный код на Solidity, поэтому видно было только сырой байт-код. Чтобы понять, что делает контракт, требовался реверс-анализ.
Аналитики Chainalysis оценили, что за первые полгода 2026 года из неверифицированных контрактов украли минимум 36,7 миллиона долларов. Отсутствие верификации не означает, что контракт вредоносный. Но без доступа к исходному коду проводить аудит и понимать бизнес-логику намного сложнее.
Реверс байт-кода нужен как красным командам — для аудита неверифицированных контрактов, разбора эксплойтов и расследования инцидентов — так и синим. Аудиторам он помогает проверять безопасность кода.
Как работает EVM
Ethereum Virtual Machine — стековая машина без регистров. Смарт-контракт на Solidity, Vyper или другом языке для EVM компилируется в последовательность опкодов — однобайтовых инструкций вроде PUSH1, SSTORE, JUMPI или CALL. Каждая инструкция тратит газ и выполняет операцию: меняет стек, память или хранилище.
Стоимость в газе может быть фиксированной или зависеть от параметров операции и состояния EVM. Набор инструкций включает примерно 140 опкодов для вычислений, сравнений, побитовых операций, хеширования, работы со стеком, памятью, хранилищем и взаимодействия с другими контрактами.
Реверс Ethereum отличается от реверса обычного бинарника двумя важными моментами. Во-первых, в байт-коде нет имён функций, отладочных символов и самого понятия функции. Контракт — это кусок кода с таблицей переходов в начале.
Во-вторых, всё публично. После развёртывания рантайм‑байт‑код остаётся в открытом доступе: кто угодно может получить его с любой ноды или через блок-эксплорер, даже если автор не опубликовал исходники.
Верификация — загрузка исходного кода на Etherscan или аналогичный сервис и проверка его соответствия байт-коду контракта — дело добровольное. На компиляцию и работоспособность контракта она не влияет.
Контракты остаются неверифицированными по разным причинам. Минимальные прокси и фабрики позволяют развернуть тысячи почти идентичных контрактов — верифицировать каждый экземпляр непрактично. Старые контракты, развёрнутые годы назад и заброшенные командой, не верифицированы, потому что эта практика тогда еще не была в ходу. Иногда контракты намеренно оставляют неверифицированными, чтобы затруднить анализ перед раг-пулом или скрыть бэкдор.
Инструменты
Для начала тебе понадобятся:
Обозреватель блоков (Etherscan или аналог) — получить байт-код задеплоенного контракта со вкладки Contract.
evm.codes — интерактивный справочник опкодов EVM и песочница для разбора байт-кода прямо в браузере. Помогает узнать, что делает каждый опкод, и увидеть результат дизассемблирования.
Декомпилятор. Heimdall-rs — бесплатный инструмент на Rust для анализа неверифицированных контрактов. Дизассемблирует байт-код, декодирует calldata без ABI, строит граф контракта и выдает декомпилированный код в стиле Solidity. Dedaub Decompiler — бесплатная альтернатива с веб-интерфейсом, принимает адрес контракта или сырой байт-код и возвращает читаемый код на нескольких уровнях абстракции.
Ghidra с расширением Mothra для EVM — для работы с крупными контрактами, если нужен полноценный графический дизассемблер с перекрестными ссылками.
Начинаем разбор
Получаем байт-код
У каждого задеплоенного контракта есть два блока байт-кода: код создания (creation code) и рантайм‑код. Первый выполняется один раз при развёртывании: формирует и возвращает рантайм‑код.
