Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
IDA — вещь удобная, но далеко не всесильная. Что делать, если тебе попался бинарник под экзотический процессор вроде CRIS, а IDA лишь развела руками? В этой статье мы разберемся, как реверсить такой код с минимальными затратами времени и нервов, не конструируя собственный дизассемблер и не собирая модуль для IDA, а немного схитрив — и все равно получив достойный результат.
В своих статьях я редко уделяю внимание необычным процессорам. Большинство исследователей уверены, что IDA всегда знает целевой процессор как родной, ну или его хотя бы можно заменить аналогичным, систему команд которого IDA уж точно понимает. К сожалению, это совсем не аксиома, IDA не всесильна, а в мире существует и активно используется множество процессоров, о которых эта программа до сих пор не имеет ни малейшего представления и навряд ли когда‑либо включит их поддержку.
Но ведь работать с ними как‑то надо! Как выкрутиться простому хакеру без столь удобного инструмента, кажущегося незаменимым? Попробуем разобрать все мытарства, ожидающие его на этом тернистом пути.
Итак, условие задачи: дана некая библиотека, определенную функциональность которой нам нужно постичь и реверсировать. Как обычно, для начала загружаем ее в Detect It Easy.
Сразу замечаем неладное: тип процессора — 32-битный CRIS — нам отродясь не встречался. Пробуем дизассемблировать библиотеку в IDA.
IDA вроде соглашается с DIE: тип файла указан как ELF for CRIS, однако предлагаемый по умолчанию тип процессора (MetaPC) настораживает. Тем более никакого CRIS в списке поддерживаемых IDA процессоров и близко нет. Естественно, следом выскакивает ошибка.
Что такое тип 76, в принципе, понятно — мгновенно нагуглив спецификацию хидера ELF, мы находим его расшифровку:
EM_CRIS 76 Axis Communications 32-bit embedded processor
Семейство довольно известное и широко используемое в узких кругах: обычно под этим типом подразумевают процессоры ETRAX фирмы Axis Communication. Само слово CRIS — это тип архитектуры подобных процессоров, оно является сокращением от Code Reduced Instruction Set, что переводится как «набор инструкций с сокращенным кодом».
Этот набор инструкций заявлен как подмножество инструкций RISC, однако при попытке выбора в IDA любого из похожих типов (да и вообще любого поддерживаемого IDA типа) осмысленного кода получить не удается.
Попробуем эмпирически проверить, что все‑таки у нас за процессор и как раскодировать его инструкции. Google показывает нам спецификацию похожего CRIS-процессора AXIS ETRAX 100LX. Посмотрим, соответствуют ли инструкции нашего процессора указанной спецификации.
Для этого попробуем раскодировать первую инструкцию _init_proc
со скриншота выше, опираясь на найденную спецификацию. Согласно ей, почти все инструкции этого процессора имеют длину 16 бит (Dword). Соответственно, раскодируемое значение будет 0xE284
. В битовом виде это будет выглядеть так:
1110 0010 1000 0100
В разделе 3 INSTRUCTIONS IN ALPHABETICAL ORDER нашей спецификации прилагаются побитовые расшифровки каждого класса инструкций этого процессора. Изрядно помаявшись, мы находим инструкцию, подходящую под нашу битовую маску, subq
.
Если верить спецификации, это операция быстрого вычитания 6-битной числовой константы из регистра. Константа определяется младшими шестью битами и в нашем случае равна 00100b=4
. Регистр Rd
же — старшие 4 бита 1110b=14
, что соответствует указателю стека sp
. То есть полная мнемоника нашей команды subq 4, sp
(переместить указатель стека на 4 байта вверх) вполне похожа на истину — обычно так начинается стандартный вход в процедуру с резервированием пула локальных переменных. Спецификация, похоже, рабочая, но не будем же мы покомандно расшифровывать несколько сот килобайт кода? Жизнь слишком коротка для подобных челленджей, надо как‑то автоматизировать процесс.
Если ты по жизни максималист и обладаешь неограниченным запасом свободного времени при полном отсутствии других интересных задач, можно сделать собственный уникальный дизассемблер‑декомпилятор, основываясь на нагугленной спецификации. Я не осуждаю подобное решение, у него множество плюсов — можно потренироваться в парсинге и глубже понять принцип действия процессора. В конце концов, это позволит создать новый, единственный в своем роде гитхабовский проект, на который потом можно наращивать новые файловые форматы и процессорные архитектуры. Его не стыдно будет положить в портфолио и публиковать о нем статьи на «Хакере» и прочих умных ресурсах.
Но цель нашей сегодняшней статьи совсем другая — выбрать путь, который позволит быстро и наименьшими усилиями реверсировать фрагмент кода редкого (и уже винтажного) процессора. А писать под такое собственный декомпилятор — это, извиняюсь за неприличное сравнение, все равно что выкупать гектар тайги и строить на нем бумажный завод для того, чтобы скастовать рулон туалетной бумаги.
Попробуем минимизировать задачу — у нас имеется IDA, которая уже умеет разбирать (и успешно разобрала) формат ELF со всеми его строками, функциями, импортируемыми‑экспортируемыми символами и прочими ништяками. Нам не хватает только одного: парсинга ассемблерных инструкций.
С другой стороны, IDA расширяема, к ней вполне можно написать свой процессорный модуль. Ты, вероятно, знаешь, что IDA позволяет писать свои плагины. Задача эта, хоть и полегче разработки собственного декомпилятора с нуля, тоже весьма непростая.
Если ты собираешься компилировать собственный нативный процессорный модуль для IDA, сложности начинаются уже на этапе получения Hex-Rays SDK под нужную (а надо сказать, что версии SDK довольно слабо совместимы друг с другом) версию дизассемблера — это весьма неприятный квест. Затем начнутся сложности с компилятором С++, потому что далеко не каждый из них справится с этим нелегким делом. Поэтому нужно заранее готовить бубен побольше.
Разработчики IDA явно рассчитывали на продвинутую хакерскую аудиторию, поэтому, чтобы не разочаровывать ее, сделали этот путь максимально хардкорным, вдобавок практически не приложив к нему толковой документации. Впрочем, разработчики сторонних плагинов написали множество статей об этом: например, статью с говорящим названием Writing an IDA Processor Module, «Добавление нового семейства процессоров в IDA pro» или «Разрабатываем процессорный модуль NIOS II для IDA Pro».
Источник: xakep.ru