Дизассемблируй это: «Лаборатория Касперского» объявляет старт зимнего конкурса CrackMe

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

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

    image

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

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

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

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

    «Лаборатория Касперского»

    346,00

    Ловим вирусы, исследуем угрозы, спасаем мир

    Поделиться публикацией
    Комментарии 18
      +9
      Чет даже неинтересно как-то. Ожидал большего, антиотладок всяких, крипторов и т.д.

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

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

        +1
        Стажёров ищут же.
          0
          Интересно, а как сразу попасть на позицию авера?)

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

            A теперь можно промахи прикрыть заранее через конкурс.
              0
              По тексту той статьи было совершенно очевидно, что ни о каких «не распознали» речи не идёт и всего лишь нужна задачка для привлечения внимания будущих сотрудников.
            0
            В третьем крякми задача больше аналитическая. Надо опознать общеизвестные алгоритмы и реверснуть 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
              Я и говорю, что тут интересного? Я правда смотрел только третью, ибо как сказали — она самая сложная. Если в первых двух интереснее ( что я сомневаюсь ), то извиняюсь.

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

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

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

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

              Мое имхо, крякми не о чем.
              0
              А чем такой красивый код, как на скриншоте получить?
              • НЛО прилетело и опубликовало эту надпись здесь
            0

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

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

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


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


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

                  +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();
                          }
                      }
                  }
                  
                  



                  Для анализа Java есть хорошая утилита ByteCodeViewer объединяющая сразу несколько декомпилирующих движков — CFR, Procyone, JD-GUI, Fernflow, Krakatau
                  Обычно, хотя бы один да справляется. При сильной обфускации обычно заNOPливаю/втыкаю JMPы мусорные инструкции и тогда справляются
                    0
                    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);
                       }
                    }
                    

                      0

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


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

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

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

                Нормально

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое