В январе 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) и ран­тайм‑код. Первый выполняется один раз при развёртывании: формирует и возвращает ран­тайм‑код.