Ломать не строить. Иногда ломать — дело не менее сложное и благородное, чем строить.

В январе «Лаборатория Касперского» открывает свой сезон зимних айтишных видов спорта и запускает конкурс CrackMe. Скачайте три файла и разреверсите их, чтобы вычислить ключ, который генерируется в зависимости от введенного адреса email. Полученный ключ необходимо зарегистрировать на сайте.

image

Задания пронумерованы в порядке повышения сложности, поэтому советуем решать их в той же очередности.

Первых 15 человек, которые успешно взломают CrackMe, мы возьмем на экскурсию по антивирусной лаборатории. Вы познакомитесь с экспертами ЛК и узнаете, чем мы тут занимаемся. Лучших участников также ждут памятные сувениры.

Возможно, задания покажутся вам чересчур сложными и все три выполнить не удастся. Не беда (спойлер: они и правда неординарные): зарегистрируйте свой результат и дождитесь объявления итогов. Отслеживать рейтинг можно здесь.

Если тема реверс-инжиниринга вам интересна, но взломать CrackMe не получилось, не расстраивайтесь. Подробные решения будут опубликованы в нашем Хабраблоге, как только конкурс завершится.
Поделиться с друзьями
-->

Комментарии (18)


  1. FancyMalware
    27.01.2017 21:17
    +9

    Чет даже неинтересно как-то. Ожидал большего, антиотладок всяких, крипторов и т.д.

    А на деле нужно просто придумать такую строку, которая успешно пройдет по всем параметрам. :(

    В прошлый раз помнится со всякими трюками было интереснее, а сейчас даже желания проходить нет, разгребая тонны проверок…


    1. TrueBers
      28.01.2017 03:23
      +1

      Стажёров ищут же.


      1. FancyMalware
        28.01.2017 04:50

        Интересно, а как сразу попасть на позицию авера?)

        Дайте мне малварку пореверсить, ISFB там, GOZI, отчет тестовый запилить ;)


      1. BalinTomsk
        28.01.2017 06:04

        лет надцать назад Касперский вещал что какой-то вирус написан на неизвестном языке, после громких заявлений выяснилось что их девелоперы не распознали что написано на С в VS6.

        A теперь можно промахи прикрыть заранее через конкурс.


        1. Maccimo
          28.01.2017 08:48

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


    1. Veliant
      28.01.2017 14:47

      В третьем крякми задача больше аналитическая. Надо опознать общеизвестные алгоритмы и реверснуть sub_4027c0.

      Мои догадки по решению крякми
      Функции sub_401C90, sub_402410, sub_402540 являются реализацией алгоритма MD5. Хэш считается от введеного e-mail.
      Введенный KEY из 16 системы приводится к QWORD(как раз есть проверка на длину ключа в 16 символов — 16байт=64бит) и ксорится с полученным MD5-хэшом.
      Функция sub_4027c0 является модифицированным CRC32/CRC64. Ей на вход подаются поксоренные данные и начальное значение 0xCB63A80F116216E2. На выходе должна получиться чексумма 0x5E251D8DA62708B1.
      Соответственно вся задача — либо реверснуть CRC, либо сбрутить 64бит чтоб получить необходимую константу, которая будет одна для всех.


      1. FancyMalware
        28.01.2017 19:26
        +1

        Я и говорю, что тут интересного? Я правда смотрел только третью, ибо как сказали — она самая сложная. Если в первых двух интереснее ( что я сомневаюсь ), то извиняюсь.

        Я мало понимаю, как подобные кряк ми связаны с анализом малвари. Точнее, совсем не понимаю. Если расшифровывать пошифрованные строки, то смысла нет, обычно нужно знать только куда стучит — это можно решить сниффером на другой машине, к которой зараженная подключается через проксю.

        Декрипторы реверсить тоже не надо, достаточно поставить аппаратный бряк в середине где-нибудь NtProtectVirtualMemory/NtAllocateVirtualMemory, занопив все проверки на виртуалку/отладчик. Вот это было бы интересно реверсить и приближенно к реальности.

        Если криптор RunPE, то на всем известные NtCreateThreadEx/NtCreateProcess, а там уже смотреть как инжект кода идет, на момент которого обычно все уже расшифрованно и достаточно тупо сдампить на диск.

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

        Мое имхо, крякми не о чем.


    1. Cadog
      28.01.2017 16:46

      А чем такой красивый код, как на скриншоте получить?


      1. pfemidi
        28.01.2017 18:41

        IDA


        1. FancyMalware
          28.01.2017 19:21
          +1

          Точнее Hex-Rays


  1. Maccimo
    28.01.2017 00:43

    Сделали бы один из CrackMe под JVM или Android для разнообразия.


    1. LexS007
      29.01.2017 04:53

      Под байт-код JVM есть аналитические декомпиляторы (Fernflower даже в IntelliJ IDEA уже встроен), так что это будет совсем не интересно.


      1. Maccimo
        29.01.2017 12:38

        Для бинарников есть IDA и декомпилятор Hex Rays, однако же не всё так просто.


        Аналитические декомпиляторы java-байткода спотыкаются, стоит лишь слегка отойти от шаблонов.
        Сможет ли IDEA декомпилировать этот класс без посторонней помощи?
        https://gist.github.com/Maccimo/fed9d46f1115f03f632d83c9b901b9fd


        Класс-файл корректен с точки зрения JVM, запускается, выводит приветствие.


        1. Veliant
          29.01.2017 14:05
          +1

          CFR вполне себе справился

          Исходник
          /*
           * Decompiled with CFR 0_115.
           * 
           * Could not load the following classes:
           *  HelloWorld
           */
          import java.io.PrintStream;
          import java.lang.invoke.CallSite;
          import java.lang.invoke.ConstantCallSite;
          import java.lang.invoke.MethodHandle;
          import java.lang.invoke.MethodHandles;
          import java.lang.invoke.MethodType;
          
          /*
           * Exception performing whole class analysis ignored.
           */
          public class HelloWorld {
              private final boolean Your decompiler lie to you, dude! = true;
          
              public HelloWorld() {
              }
          
              public static /* varargs */ /* synthetic */ void main(String ... arrstring) {
                  HelloWorld.bootstrap();
              }
          
              private static /* synthetic */ void sayHello() {
                  System.out.println("Hello, world!");
              }
          
              private static /* synthetic */ CallSite bootstrap(MethodHandles.Lookup lookup, String string, MethodType methodType) {
                  MethodHandle methodHandle = null;
                  try {
                      ClassLoader classLoader = HelloWorld.class.getClassLoader();
                      MethodType methodType2 = MethodType.fromMethodDescriptorString("()V", classLoader);
                      methodHandle = lookup.findStatic(HelloWorld.class, "sayHello", methodType2);
                      return new ConstantCallSite(methodHandle);
                  }
                  catch (Exception var4_5) {
                      throw new BootstrapMethodError();
                  }
              }
          }
          
          


        1. LexS007
          29.01.2017 16:44

          Fernflower тоже почти справился, только main() не разобрал.

          Да и в любом случае байт-код проще исследовать чем asm. Так что если и устраивать CrackMe для Android, то должны бить бинарники скомпилиные под arm для интереса и разнообразия.

          HelloWorld.java
          import java.lang.invoke.CallSite;
          import java.lang.invoke.ConstantCallSite;
          import java.lang.invoke.MethodHandle;
          import java.lang.invoke.MethodType;
          import java.lang.invoke.MethodHandles.Lookup;
          
          public class HelloWorld {
             private final boolean Your decompiler lie to you, dude!;
          
             // $FF: synthetic method
             public static void main(String... param0) {
                // $FF: Couldn't be decompiled
             }
          
             // $FF: synthetic method
             private static void sayHello() {
                System.out.println("Hello, world!");
             }
          
             // $FF: synthetic method
             private static CallSite bootstrap(Lookup var0, String var1, MethodType var2) {
                MethodHandle var3 = null;
          
                try {
                   ClassLoader var4 = HelloWorld.class.getClassLoader();
                   MethodType var5 = MethodType.fromMethodDescriptorString("()V", var4);
                   var3 = var0.findStatic(HelloWorld.class, "sayHello", var5);
                } catch (Exception var6) {
                   throw new BootstrapMethodError();
                }
          
                return new ConstantCallSite(var3);
             }
          }
          


          1. Maccimo
            30.01.2017 01:23

            Целью было показать, что не стоит надеяться получить корректный код просто открыв файл в IDEA.


            Все методы, кроме main() такие же, как у javac, так что они ожидаемо декомпилируются без проблем.
            Стоит добавить запутывание графа потока управления, сделать вычисление целевых методов invokedynamic непрозрачными, приправить это большим объёмом кода и мусорных инструкций и времязатраты на анализ возрастут.


            1. FancyMalware
              30.01.2017 01:29

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

              Так что все же с джавкой все проще обстоит.


  1. AndreyFr
    28.01.2017 15:04

    Нормально