+ Reply to Thread
Results 1 to 4 of 4

Thread: ESET CrackMe – CONFidence 2o1o

  1. #1
    root's Avatar

    Default ESET CrackMe – CONFidence 2o1o

    Источник: habrahabr.ru


    Компания Eset уже на протяжении нескольких лет выступает спонсором конференции, посвящённой практическим аспектам информационной безопасности — CONFidence. И каждый год мы предлагаем задание в виде crackme, за быстрое решение которого выдаются ценные призы. В этом году наш польский офис, официальное открытие которого состоялось в начале года, подготовил весьма оригинальное задание. Ведь конференция проходила в их родном городе, в Кракове.


    Если вы хотите попробовать свои силы, тогда не читайте информацию подкатом, так как там мы опубликовали описание алгоритма проверки регистрационного кода. Скачать crackme можно здесь.

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

    В технологическую основу вычислений корректного регистрационного кода легла виртуальная машина, выполняющая вычисления с введёнными данными, на основе простейших битовых операций. Такого рода виртуализация кода используется при построении защиты программного обеспечения от нелегального распространения и копирования. Например, протекторы VmProtect и Themida (считаются в народе одними из самых сложных защит для обратного анализа) тоже используют технологии преобразования оригинального кода программы в некоторой байт-код. Этот байт-код выполняется уже обработчиками виртуальной машины, которая во многом избыточна, чтобы усложнить обратный анализ и восстановление логики работы первоначального алгоритма.

    Вернемся к нашей виртуальной машине, которая имеет в своем распоряжении 8 псевдорегистров, назовем их условно: rA, rB, rC, rD, rE, rF, rG, rH. Каждый регистр имеет размер 1 бит. Набор поддерживаемых команд является следующим:
    • ret — завершение работы виртуальной машины;
    • set <имя_регистра> – установить значение регистра в единичное состояние;
    • jz <имя_регистра> – команда условной передачи управления (если содержимое регистра равно 0, то осуществляется передача управления следующей процедуре (процедуры расположены в памяти последовательно));
    • and <имя_регистра1>, < имя_регистра2> – логическая операция, результат сохраняется в первом регистре;
    • mov <имя_регистра1>, <имя_регистра2> – скопировать содержимое второго регистра в первый;
    • mov <имя_регистрa, <адрес> – скопировать содержимое памяти (бит) по заданному адресу в заданный регистр;
    • mov <адрес>, <имя_регистра> – скопировать содержимое заданного регистра (бит) по заданному адресу в памяти
    Размер инструкции виртуальной машины имеет фиксированный размер и равен 2 байтам. Принцип кодирования инструкций можно изобразить в виде следующей схемы:


    Данная виртуальная машина осуществляет преобразование содержимого памяти, в соответствии с управляющей последовательностью (которую как раз и нужно найти), которая так же располагается в памяти:
    • начало памяти + 0x00: управляющая последовательность (16 байт)
    • начало памяти + 0x10: хэш-значение от введённого имени(16 байт)
    • начало памяти + 0x20: зашифрованное хэш-значение (16 байт)
    • начало памяти + 0x30: результат преобразования функции виртуальной машины (16 байт)
    Цикл обработки команд виртуальной машины не выглядит слишком уж жестко, по сравнению с аналогами коммерческих протекторов.


    Для более удобного разбора байт-кода команд выполняемых виртуальной машиной мы написали процессорный модуль для дизассемблера IDA Pro, который сильно упростил нам дальнейший анализ. Вот так вот выглядит набор команд до их преобразования нашим процессорным модулем:


    А на картинке ниже представлен вариант обработки процессорным модулем:


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


    Мы решили пока не выкладывать исходный код генератора правильных регистрационных номеров, чтобы у вас сохранился еще исследовательский запал, посмотреть самим этот crackme.

    Но мы все-таки в качестве примера приведем несколько правильных комбинации:

    Name: habrahabr
    Registration Code: 984116e52ad86d6bd144b11b975a595e

    Name: SVH
    Registration Code: 271a300e1174f46f944c5c67dc59dd57

    Name: CONFidence
    Registration Code: 24a2b8dc7c1578de64f8e8e114c2bf00
    Attached Files
    Last edited by root; 22-02-2014 at 13:52.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  2. #2

    Default Re: ESET CrackMe – CONFidence 2o1o

    Еще тогда сам разбирал эту балалайку.

    Это мое оставшееся описание виртуальной машины:
    Общая характеристика виртуальной машины:
    - команд - 7
    - рабочие переменные - есть
    - контекст - нет
    - собственный стек - нет

    Формат команд:
    опкод команды - старшие 3 бита (15..13)
    111-1110000000000
    543-2109876543210
    -----------------
    000-xxxxxxxxxxxxx - без операндов
    опкод 1,2,3 - унарная операция
    001-xxxxxxxxxxIII - номер бита рабочей переменной V (2..0) III
    010-xxxxxxxxxxIII
    011-xxxxxxxxxxIII
    опкод 4,5 - бинарная операция
    100-xxxxOOOxxxIII - номер бита рабочей переменной V (2..0) III
    - номер бита рабочей переменной V (8..6) OOO
    101-xxxxOOOxxxIII
    опкод 6,7 - бинарная операция
    110-XXXXXYYYYYIII - номер бита рабочей переменной V (2..0) III
    - смещение двойного слова в памяти относительно базы (12..8) ХХХХХ
    - номер бита двойного слова в памяти (7..3) YYYYY
    111-XXXXXYYYYYIII

    Команды:
    0 - выбрасывание двойного слова из стека (esp+4) -> EXIT/ENDIF
    1 - проверка состояния бита в рабочей переменной и проброс группы команд если бит 0 -> IF(V.bit)
    2 - инверсия (дополнение) значения бита в рабочей переменной -> NOT V.bit
    3 - установка значения бита в рабочей переменной в 1 -> SET V.bit
    4 - логическое И значений битов в рабочей переменной -> AND V.bit2, V.bit1
    5 - передача значения бита в рабочей переменной -> MOV V.bit2, V.bit1
    6 - передача значения бита из памяти в рабочую переменную -> MOV V.bit1, X[].bit2
    7 - передача значения бита из рабочей переменной в память -> MOV X[].bit2, V.bit1

    Есть ИДА скрипт для анализа ленты пикода.
    И написанный кейген.
    Если будут желающие выложу.

    Name: OKOB
    RegNum: C6BE5E7972E23E212D3C36C9B98B79D8

  3. 2 пользователя(ей) сказали cпасибо:
    Darwin (17-02-2014) ximera (17-02-2014)
  4. #3
    ARCHANGEL's Avatar

    Default Re: ESET CrackMe – CONFidence 2o1o

    Так а бинарь ни у кого не завалялся? А то мне для исследований хотелось бы посмотреть.
    Добрым быть просто - достаточно обратить свой гнев на негодяев...

  5. #4
    Darwin's Avatar

    Default Re: ESET CrackMe – CONFidence 2o1o


  6. 2 пользователя(ей) сказали cпасибо:
    ARCHANGEL (24-02-2014) root (22-02-2014)
+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:30
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org