Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 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, позволяющий преобразовать бинарник в код на С++. Подробности – в февральском номере ][ за этот год.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001