eXeL@B —› Основной форум —› ESET Confidence 2010 CrackMe |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 07 июня 2010 12:19 · Личное сообщение · #1 На конференции в Кракове был вот такой крякми: 2010.confidence.org.pl/esetcrackme.exe Для запуска надо процессор с поддержкой: SSE2 Код проверки засунут в самодельную ВМ, ребята из HISPASEC (virustotal) сделали серийник за 8 часов. 60f6_07.06.2010_CRACKLAB.rU.tgz - esetcrackme.exe |
|
Создано: 07 июня 2010 12:22 · Поправил: Coderess · Личное сообщение · #2 |
|
Создано: 07 июня 2010 12:33 · Личное сообщение · #3 |
|
Создано: 07 июня 2010 12:46 · Личное сообщение · #4 |
|
Создано: 07 июня 2010 12:52 · Поправил: BoRoV · Личное сообщение · #5 |
|
Создано: 07 июня 2010 13:30 · Личное сообщение · #6 |
|
Создано: 07 июня 2010 13:37 · Личное сообщение · #7 |
|
Создано: 07 июня 2010 13:44 · Личное сообщение · #8 |
|
Создано: 07 июня 2010 15:48 · Личное сообщение · #9 |
|
Создано: 07 июня 2010 16:10 · Личное сообщение · #10 |
|
Создано: 07 июня 2010 18:44 · Личное сообщение · #11 int пишет: есть КОП для пропуска мусора да не мусор там прокидывается, а группа команд если бит нулевой например Code:
что преобразуется в if(X[1] & (1 << 1)) { X[10] <<= 1; X[10] &= ~1; } ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 07 июня 2010 18:54 · Личное сообщение · #12 |
|
Создано: 08 июня 2010 10:23 · Личное сообщение · #13 |
|
Создано: 10 июня 2010 17:46 · Поправил: OKOB · Личное сообщение · #14 |
|
Создано: 10 июня 2010 19:02 · Поправил: OKOB · Личное сообщение · #15 Ядром и основной заморочкой крэкми является код под виртуальной машиной. Общая характеристика виртуальной машины: - команд - 8 - рабочие переменные - есть - контекст - нет - собственный стек - нет Формат команд: опкод команды - старшие 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 ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 10 июня 2010 21:08 · Личное сообщение · #16 |
|
Создано: 10 июня 2010 21:31 · Личное сообщение · #17 написал по многочисленным просьбам, да и топик для этого вернули. mak пишет: в виде статьи давай все и началось с того что писать статью с одной стороны лень, а с другой до конца расписанное решение мало кого чему научит, а так в дискусии, в ответах на вопросы может быть кто-то сам еще поборется с чудищем заморским. Руку набьет, шишку натрет. Инфы этой ой как мало для получения номера ибо команд пикода там больше 195000, а разнообразие всего семь (описанные выше) Так что заняться есть чем. Ожидаются предложения по методам распарсивания пикода. ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 10 июня 2010 22:08 · Личное сообщение · #18 Ну да согласен , толку от этого не много , но если уже прогнал вм пару раз и вникнул , то разбирать интереснее когда нет инфы по командам , тем более тут интерес большой , так как тут тип Hybrid Virtual Machine , куда входит MACRO и MICRO вариации , основные черты , малый набор команд , большое количество пикода , выполнение каждой команды в виде последовательности микро операций, также команда может выполнять много действий , зависит от реализации, это один из самый сложных типов вм, материала по этому вообще с гулькин нос , ну ладно уж) .. поэтому статью в народ =) ... это важная инфа , и классный крэкми. Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 11 июня 2010 18:58 · Поправил: white_rabbit · Личное сообщение · #19 |
|
Создано: 11 июня 2010 20:22 · Поправил: OKOB · Личное сообщение · #20 Глянул блог. Порадовало. Цитаты из блога 1) имеет в своем распоряжении 8 псевдорегистров, назовем их условно: rA, rB, rC, rD, rE, rF, rG, rH. Каждый регистр имеет размер 1 бит. 2) Мы дали название командам, похожие на уже знакомые нам аналоги из x86 ассемблера. 3) и далее команды типа mov rB,0ABh или mov 9, rG 4) также команда jz <имя_регистра> – команда условной передачи управления (если содержимое регистра равно 0, то осуществляется передача управления следующей процедуре (процедуры расположены в памяти последовательно)); которая не определяет адреса перехода, но содержит проверяемое условие (x86 jz - zero flag - условие косвенно в мнемонике, VM jz - переход если zero значение операнда). 5) ret — завершение работы виртуальной машины; а как-же подъем после выполнения тела IF ЗЫ: 6) Набор поддерживаемых команд является следующим: ret — завершение работы виртуальной машины; set <имя_регистра> – установить значение регистра в единичное состояние; jz <имя_регистра> – команда условной передачи управления (если содержимое регистра равно 0, то осуществляется передача управления следующей процедуре (процедуры расположены в памяти последовательно)); and <имя_регистра1>, < имя_регистра2> – логическая операция, результат сохраняется в первом регистре; mov <имя_регистра1>, <имя_регистра2> – скопировать содержимое второго регистра в первый; mov <имя_регистрa, <адрес> – скопировать содержимое памяти (бит) по заданному адресу в заданный регистр; mov <адрес>, <имя_регистра> – скопировать содержимое заданного регистра (бит) по заданному адресу в памяти пропущена одна команда с опкодом 2 7) Данная виртуальная машина осуществляет преобразование содержимого памяти, в соответствии с управляющей последовательностью (которую как раз и нужно найти), которая так же располагается в памяти: начало памяти + 0x00: управляющая последовательность (16 байт) начало памяти + 0x10: хэш-значение от введённого имени(16 байт) начало памяти + 0x20: зашифрованное хэш-значение (16 байт) начало памяти + 0x30: результат преобразования функции виртуальной машины (16 байт) управляющая последовательность во всеобщем понимании это последовательность команд в данном случае "управляющая последовательность" это данные с которыми работает виртуальная машина, а именно регистрационный номер. Это особенно удивительно когда пишуший это уже свернул код и видел, что это операнды арифметических команд. 8) в формате команды откуда-то взялись биты 18..12; адрес блока памяти сдвинутый на 2 бита влево и это при команде в коде обработчика виртуальной машины lea ebx, dword_462884[ebx*4]. да к тому же маска для выделения поля команды 1F00h. .text:00401685 and ebx, 1F00h и как команда .text:0040168E and eax, 0F8h может выделить поле в команде --- биты 3..8??? ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 11 июня 2010 20:34 · Личное сообщение · #21 |
|
Создано: 11 июня 2010 20:49 · Личное сообщение · #22 Это еще не трава Трава вот: дальнейший анализ показал избыточность первоначального набора команд, т.к. операция сложения по модулю два (исключающее или) выражалась через эквивалентные вычисления при помощи других булевых операций т.е. из простых команд набирается сложная и ввиду этого какая-то команда из простых оказывается лишней (избыточной) ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 12 июня 2010 00:11 · Личное сообщение · #23 ESET Russia: Для более удобного разбора байт-кода команд выполняемых виртуальной машиной мы написали процессорный модуль для дизассемблера IDA Pro, который сильно упростил нам дальнейший анализ. Из пушки по воробьям. А мы обошлись скриптом ИДА. Исполнять в ИДА после распаковки кода, например при остановке на входе в ВМ. .text:004013F4 mov esi, offset PICODE .text:004013F9 call VM_ENTRY Будет сгенерирован листинг кода ВМ -- VM_CRME.LOG более 5 метров. 6ea3_11.06.2010_CRACKLAB.rU.tgz - !vm_crackme.idc ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 12 июня 2010 01:48 · Личное сообщение · #24 |
|
Создано: 12 июня 2010 08:53 · Личное сообщение · #25 Gideon Vi пишет: ушло семь часов из восьми V0ldemAr пишет: ребята из HISPASEC (virustotal) сделали серийник за 8 часов. Поляки мне написали, когда я им отправил решение, что победители справились за 3,5 часа... "Nice work We hope you enjoyed reversing this file. The winners were Gynvael Coldwind and Jooru, it took them 3,5h to find a proper username and password." часов семь где-то мне понадобилось с перерывами на работу и сон и основное время ушло на обращение функции проверки номера, пока еще больше не свернул прямой код. ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 12 июня 2010 10:43 · Личное сообщение · #26 |
|
Создано: 16 июня 2010 12:01 · Личное сообщение · #27 И так мы имеем следующие три команды: 2 - инверсия (дополнение) значения бита в рабочей переменной -> NOT V.bit (в С нотации ~V.bit) 3 - установка значения бита в рабочей переменной в 1 -> SET V.bit 4 - логическое И значений битов в рабочей переменной -> AND V.bit2, V.bit1 (в С нотации V.bit2 & V.bit1) Что из них можно еще накрутить? 1) CLEAR V.bit CLEAR V.bit = ~(SET V.bit) = ~1 = 0 2) OR V.bit2, V.bit1 используем правила де Моргана (http://ru.wikipedia.org/wiki/Законы_де_Моргана) OR V.bit2, V.bit1 = ~(~V.bit2 & ~V.bit1) = V.bit2 | V.bit1 3) XOR V.bit2, V.bit1 оно же сложение по модулю 2 (http://ru.wikipedia.org/wiki/Сумма_по_модулю_два) XOR V.bit2, V.bit1 = (V.bit2 | V.bit1) & (~V.bit2 | ~V.bit1) = V.bit2 ^ V.bit1 используем уже описанное выше OR 4) SHL X[], 1 раскладка опрации на "микро"-команды в посте #11 5) ADD X2[], X1[] при наличии сложения по модулю 2 не вопрос. CFp - перенос из предыдущего разряда в текущий CFn - перенос из текущего разряда в следующий bit2 = bit1 ^ bit2 ^ CFp CFn = ((bit2 ^ bit1) & CFp) ^ (bit2 & bit1) 6) MUL X2[], X1[] реализуется используя IF(V.bit), SHL и ADD а уже из этих команд и собран весь алго проверки серийного номера ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 16 июня 2010 22:14 · Личное сообщение · #28 OKOB Прикладываю мой вариант лога. Команда CLEAR видна сразу: SET (var.bit5) NOT (var.bit5) Далее команда OR тоже распознаётся легко: NOT (var.bit1) NOT (var.bit3) AND (var.bit1), (var.bit3) NOT (var.bit1) Но я не врубаюсь с этим XOR...не могу найти последовательность микрокоманд подходящую. Ты не мог бы привести кусок лога (желательно моего - он более понятный )? e919_16.06.2010_CRACKLAB.rU.tgz - eset_vm.rar ----- the Power of Reversing team |
|
Создано: 17 июня 2010 00:39 · Личное сообщение · #29 DillerInc В самом начале лога дважды: XOR var.bit1, var.bit6 Code:
XOR var.bit2, var.bit1 Code:
Итого формула иная, чем дал OKOB - ¬((¬(A /\ ¬B)) /\ (¬(¬A /\ B))) = {закон де-Моргана} = (A /\ ¬B) \/ (¬A /\ B) = A B Займитесь лучше вмпротом |
|
Создано: 17 июня 2010 12:05 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Основной форум —› ESET Confidence 2010 CrackMe |