Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 116, АВГУСТ 2008 г.

Добрый скальпель хакера

Крис Касперски

Хакер, номер #116, стр. 116-028-1

Чем нас порадовал свежий релиз дизассемблера IDA Pro

Свершилось! IDA Pro 5.3 уже в продаже (и даже в Осле)! Ослепительный фейерверк новых фич, полностью переписанный отладчик, сотни исправленных ошибок, дефектов и глюков старой версии, более полная экстракция отладочной инфы, модули для iPhone, Symbian OS, Linux'а и куча всего того, о чем прежде оставалось лишь мечтать. Мы это уже пощупали!

Освежим воспоминания. Изначально IDA представляла собой интерактивный дизассемблер, радикальным образом отличающийся от пакетных дизассемблеров своего времени. Те лишь заглатывали бинарный код, выдавая на выходе ассемблерный листинг. Над котором приходилось кропотливо работать, составляя в текстовом редакторе специальные правила для дизассемблера, объясняющие, где он накосячил и как это надо было дизассемблировать. После чего весь процесс повторялся. Хакер опять изучал полученный листинг, составлял новый список правил… и мучился так вплоть до полного изнеможения.

Ильфак, создатель IDA, был первым, кому пришла в голову идея «прикрутить» к дизассемблеру интерактивный движок, тесно взаимодействующий с пользователем и позволяющий решать практически все мыслимые и немыслимые проблемы. Приемы против дизассемблеров перестали работать, поскольку теперь защитам приходится воевать не с тупым дизассемблером, а мыслящим хакером, сидящим за штурвалом.

Сначала IDA приобрела поддержку макросов и скриптового языка, напоминающего сильно урезанный Си. Скрипты, написанные хакерами, не только автоматизировали взлом, но и позволяли распаковывать упакованный код прямо в ИДЕ. Очень удобно, хотя ограниченные возможности скриптов тормозили прогресс. И вот, наконец, появились плагины, дающие полный доступ к внутреннему API ИДЫ. Плагины пишутся на приплюснутом Си – пишутся долго и совершенно ненаглядно. А потому хакеры тут же прикрутили к ИДЕ всевозможные языки типа Perl'а и Python'а, делающие программирование простым и понятным, без отрыва от производства, в смысле без выхода из дизассемблера.

За время своего существования IDA Pro превратилась в настоящую хакерскую империю. Это намного больше, чем дизассемблер. Это и дизассемблер, и отладчик, и распаковщик упакованных файлов, и анализатор потока управления, и сканер безопасности для полуавтоматического поиска дыр в приложениях. Целый мир с возможностями, которые с выходом очередной версии все больше приближаются к безграничным.

Отладочные возможности IDA Pro

Способы исследования программ делятся на две категории — статический анализ (дизассемблирование) и динамический (отладка). Обе категории имеют свои сильные и слабые стороны, а потому на практике активно применяется гибридный способ, открывающий большие возможности, но вынуждающий хакера попеременно мотаться от дизассемблера к отладчику, снимая дампа памяти и перетягивая символьную информацию в обоих направлениях. Это ужасно напрягает и приводит к неоправданному перерасходу времени.

Отсюда и родилась идея — встроить отладчик непосредственно в сам дизассемблер. Ильфак был не первым, кто это осуществил (определенным успехом до него пользовался знаменитый W32Dasm), да и первые попытки создавали крайне неблагоприятное впечатление – отладчик, встроенный в IDA 4.x, на фоне Ольги выглядел детской игрушкой, не говоря уже о могучем SoftICE. С выходом версии 5.x ситуация слегка изменилась, и IDA-отладчик дорос до минимально потребного уровня. SoftICE к тому времени уже превратился в разлагающийся труп, зато Ольга существенно упрочнила свои позиции, собрав нехилую коллекцию плагинов и скриптов, которой не могла похвастаться IDA 5.х.

IDA 5.3 совершила отчаянный рывок, попытавшись переплюнуть Ольгу там, где она никогда не была сильна — в отладке многопоточных приложений и обработке структурных исключений. И это, надо сказать, ей удалось. К достоинствам относятся и полная интеграция с дизассемблером, которая экономит немало времени. Плагины и скрипты для IDA-отладчика уже начинают появляться, в дальнейшем их число будет только расти. Впрочем, на Windows-платформе Ольга не собирается сдавать свои позиции (особенно, в свете грядущего выхода версии 2.х). К Ольге хакеры уже привыкли, а в IDA Pro все по-другому. Интерфейс продуман не лучшим образом, да и сами отладочные возможности пока все-таки слабоваты.

Зато на Linux-платформе отладчик IDA Pro смотрится более соблазнительно, чем GDB. Хотя GDB – куда более мощная штука, он требует времени на изучение. А IDA Pro предоставляет интерактивный и интуитивно понятный интерфейс, переплевывающий практически все конкурирующие отладчики. Во всяком случае на прикладном уровне (ну а на ядерный IDA Pro пока и не замахивалась).

А в сфере мобильных устройств отладочные возможности IDA Pro (какими бы скромными не были) всегда вызывали огромный интерес, учитывая появление большого количества малвари под мобильные устройства и защищенных программ, у которых так и хочется отломать все ненужное.

Дихлофос, хлорофос, карбофос…

IDA Pro – сложный программный комплекс, разумеется, не лишенный ошибок. Ошибки, как известно, бывают разные: от вполне безобидных до коварных и разрушительных. Крах базы IDA Pro (на легальных, а не ломаных версиях) – явление достаточно редкое, но все-таки встречающееся. Впрочем, это не создает большой проблемы, если периодически сохранять результат дизассемблирования на диск в упакованную базу — практически у всех хакеров уже давно выработался стойкий инстинкт. Ну а кто не сохраняется, тот сам виноват.

Ошибки в «движке» дизассемблирования, приводящие к выдаче неверного результата, намного более коварны, поскольку коверкают логику работы анализируемой программы, делая ее совершенно непонятной. Над подобными головоломками можно биться часами (если под рукой нет другого дизассемблера, чтобы сравнить результаты) и они – самое большое зло для реверсеров, какое только можно представить.

Хакеры бессознательно доверяют IDA Pro, считая ее непогрешимой, хотя она ошибается намного чаще, чем конкурирующие дизассемблеры. Касательно движка для x86 процессоров, IDA Pro 5.3 наконец-то научилась распознавать UD2-инструкцию, специально предназначенную для исключения «неверный опкод» и встречающуюся во многих защитах. То же самое относится и к 3хбайтовым NOP-инструкциям (0F 19..0F 1E), которые в списке изменений значатся как недокументированные, когда на самом деле они очень даже документированные (Ильфак не читает мануалов?!).

Нераспознанные инструкции, представленные в виде данных, конечно, сбивают хакера с толку, но все же не срывают ему крышу и не высаживают на измену. Берем мануалы, изучаем, определяем опкод вручную, вручную же транслируем заданную последовательность байт в соответствующую инструкцию (благо, IDA Pro это позволяет) и пьем пиво. Или квас.

Хуже, когда IDA Pro пакостит втихую. Например, не учитывает команду DEC/INC SP в 32-разрядном сегменте, что приводит к неверно вычисленным смещениям локальных переменных и аргументов а, как следствие, к неверному анализу всей функции в целом. Процессорный модуль для платформы .NET также еще толком не отлажен, хотя появился не вчера и даже не позавчера. IDA Pro 5.2 неверно декодировала команды conv.r4, conv.r8 и conv.r.un. В версии 5.3 это исправлено.

Самая приятная новость — функции с EH_prolog наконец-то дизассемблируются правильно!!! Соль в том, что классический пролог устанавливает EBP на самое дно стекового фрейма, и потому все локальные переменные приобретают отрицательные смещения, а все аргументы — положительные. Функции с E прологом H_prolog делят стековый фрейм на две части. В одну попадают буфера, в другую — скалярные переменные и указатели. Впервые эта техника была применена в pro-police (бесплатном расширении для знаменитого GCC-компилятора) для борьбы со стековыми переполнениями, а затем была «позаимствована» компанией Microsoft. Регистр EBP устанавливается на границу, отделяющую буфера от не-буферов. Буфера приобретают отрицательные смещения, а скалярные переменные, указатели и аргументы — положительные, но вплоть до версии 5.2 (включительно) IDA Pro обзывала их всех аргументами, озадачивая хакеров — мол, какая интересная функция! Ей передали пару-тройку аргументов, а она приняла на грудь целый десяток, оперируя ими, как ни в чем не было. Приходилось выкручиваться, танцуя с бубном. В версии 5.3 это исправлено, и бубен можно положить на полку.

Исправление ошибок можно только приветствовать. Очень приятно, что Ильфак предпочитает гонять баги, тогда как большинство компаний тяготеют к лихорадочному добавлению новых фич, исправляя ошибки только тогда, когда они уже всех достанут. С другой стороны, не совсем радует политика обновлений. Если IDA 5.3 фактически представляет собой один большой баг-фикс (не без новых возможностей, конечно), почему бы ее не раздавать бесплатно всем желающим в виде заплаток для всех измененных файлов? Microsoft, Adobe и еще куча других компаний делают это даже без проверки лицензии. Брать с пользователя деньги за исправление своих же ошибок это, знаете ли, может делать только Ильфак, который сменил Пьера (не Безухова), и теперь он CEO. Похоже, готовится забросить кодинг и заняться бизнесом, чего, впрочем, уже давно следовало ожидать, наблюдая агонию развития IDA Pro на протяжении последних пяти лет. Реально новых идей нет, реально новых фич — тоже. А те, что есть — настоящим хакерам либо не нужны (графы, декомпилятор) и годятся только для привлечения «пионеров», либо же недостающий функционал покрывается скриптами и плагинами.

Переходить или нет?

Само по себе усиление отладочных возможностей — еще не повод покупать новую IDA Pro (но хороший повод обновиться тем, кто еще не успел этого сделать), и, естественно, не повод мигрировать с Ольги на IDA Pro. Тем не менее, удобства интегрированного отладчика — очевидны.

Так стоит ли переходить на новую версию IDA Pro или нет? Естественно, для тех, кто выловил ее в Осле, вопрос вообще не стоит. Халява! Профессиональные реверсеры, работающие на респектабельные фирмы, тоже не заморачиваются такими вещами — фирма предоставляет реверсеру все необходимое, в том числе и последние версии IDA Pro, а если не предоставляет — зачем работать в такой фирме?

Фрилансерам и независимым консультантам приходится хуже всего. Никто им на халяву IDA Pro не даст. Пользоваться ворованной версией в общем случае противозаконно и весьма чревато (особенно при работе на зарубежные компании). Однако если за реверсинг платят, то с учетом текущих расценок новая IDA окупается буквально за несколько дней. В худшем случае, за неделю. Ну, пускай за месяц (смотря, какая у реверсера квалификация).

А вот тем, кто пишет плагины для IDA Pro (и не просто пишет, а еще и продает их), выход всякой новой версии, как нож в сердце. Совместимость, мягко говоря, здесь и не ночевала. Всю коллекцию плагинов приходится тестировать заново, добавляя многочисленные #ifdef'ы для обеспечения совместимости со всеми версиями или отбранчивая код (в клинических случаях), причем эта работа не окупается, поскольку поддержка проданных плагинов стоит копейки, а времени отнимает… на рубли, фунты и стерлинги.

Вот такая непростая ситуация получается. Нас вынуждают обновляться независимо от того, желаем ли мы этого или нет. Ну что ж, Ильфак тоже хочет кушать.

Свободный обзор новых возможностей

  • Полностью переписано ядро отладчика — усилена поддержка многопоточных приложений (в том числе, в Linux) и улучшена обработка структурных исключений.
  • Добавлены отладочные модули для iPhone и Symbian OS, поставляемые вместе с исходными текстами, что позволяет их совершенствовать самостоятельно, не дожидаясь выхода новой версии — отличная новость для всех хакеров, обитающих на мобильных платформах и смартфонах.
  • Радикально улучшена поддержка PIC-кода (Position-Independent Code — Позиционно Независимый Код), встречающегося в shell-кодах, а также многих защитных механизмах, что облегчает жизнь как исследователям малвари, так и кодокопателям, освобождающим программы от оков ключевых файлов, серийных номеров и прочего.
  • Более качественная экстракция отладочной информации из MS PDB-файлов — интересна главным образом исследователям недр операционных систем семейства NT. А также хакерам, анализирующим изменения в заплатках от Microsoft на предмет поиска дыр, которые они затыкают, чтобы заточить exploit под непатченные системы (или даже пропатченные, ибо большинство дыр затыкаются далеко не с первого раза).
  • Языковые расширения от независимых разработчиков (типа IDA Perl, IDA Python) приобрели официальный статус, а вместе с ним и официальный API для взаимодействия с IDA Pro, существенно облегчив процесс стыковки IDA Pro с различными интерпретаторами.
  • Проделана огромная работа по исправлению ошибок. По сути, IDA Pro 5.3 представляет собой огромный bug-fix. Только один официальный список изменений насчитывает свыше сотни фиксов. Подлинное число гораздо больше и часть ошибок исправлено «втихую». Достаточно взять хотя бы ошибку с отладкой файлов, имеющих нулевой базовый адрес, что в предыдущих версиях приводило к потере контроля над отлаживаемой программой (подробнее см. блог Криса: souriz.wordpress.com). В 5.3 это уже исправлено, однако баг в официальном списке не значится, что наводит на определенные размышления.
  • Обновлена сигнатурная база для новых версий компиляторов от Borland, Microsoft и некоторых других, что полезно практически всем реверсерам без исключения.

WWW

  • www.hex-rays.com/idapro – официальный сайт, где выложена сама IDA Pro, сопроводительная документация, куча примеров и бесплатных утилит. Также имеется форум (впрочем, доступный только легальным пользователям).

INFO

Одним из самых популярных плагинов для IDA является HexRays, позволяющий преобразовать бинарник в код на С++. Подробности – в февральском номере ][ за этот год.

Содержание
ttfb: 7.5380802154541 ms