NeoQuest 2014 Hasta la vista

NeoQuest 2014 (Hasta la vista)

Дан файл MyGreenManController. С помощью утилиты file, смотрим, что это такое.

[email protected]:~$ file MyGreenManController 
MyGreenManController: Zip archive data, at least v2.0 to extract

Распаковываем архив с помощью любого архиватора. В результате имеем файлы приложения под андроид. В глаза бросается файл classes.dex

При помощи dex2jar получаем jar архив. Затем исследуем полученный файл с помощью jd gui

Результат декомпиляции

Хорошо видно, что присутствует 6 классов:

  • A — отвечает за расшифровку какого-то файла и проверку некоторых данных об аппарате
  • AA — отвечает за создания ссылки и скачивание файла
  • BuildConfig
  • Code — отвечает за внешний вид приложения
  • QueryString — отвечает за создание валидной ссылки на файл
  • R

Проанализировав код, можно понять логику работы. Сначала формируется ссылка на какой-то файл, затем он скачивается и при соблюдении некоторых условий происходит расшифровка. Поскольку java является интуитивно понятным языком, воспроизведем действия вручную.

Подставим нужные аргументы в функцию aa и получим зашифрованный файл.

http://hastalavistababy.ru/index.php?cmd=1&time=1234&command_name=download_image&path=neoquest_2014

Теперь нужно как-то расшифровать данный файл. Соберем необходимые условия.

Проверка идентификатора устройства

...
if (!paramTelephonyManager.getDeviceId().equals("352276054393855")) {}
...

 Проверка кода оператора сим-карты

... 
} while (!paramTelephonyManager.getSimOperator().equals("25001"));
...

Функция aaaa в данном случае возвращает md5 от строки

...
localStringBuffer.append(aaaa("neoquest_2014"));
...

 

Соберем полученные данные и напишем простой расшифровщик файла:

import java.io.FileOutputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.io.IOUtils;

public class JavaApplication {

    public static void main(String[] args) throws Exception {
        StringBuffer localStringBuffer = new StringBuffer();
        String str = "5ca25da65d836105076b948314a114b8"; // md5(352276054393855 + 25001 + md5(neoquest2014))
        localStringBuffer.setLength(0);
        localStringBuffer.append(str);
        aa(localStringBuffer.toString().substring(0, 16).getBytes()); // расшифровка файла

    }
    // чтение, расшифровка файла, запись
    public static void aa(byte[] paramArrayOfByte) throws Exception {
    SecretKeySpec localSecretKeySpec = new SecretKeySpec(paramArrayOfByte, "AES");
    byte[] arrayOfByte1 = IOUtils.toByteArray(new FileInputStream("neoquest_2014")); // полный путь к зашифрованному файлу
    Cipher localCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    localCipher.init(1, localSecretKeySpec);
    localCipher.init(2, localSecretKeySpec);
    byte[] arrayOfByte2 = localCipher.doFinal(arrayOfByte1);
    FileOutputStream localFileOutputStream = new FileOutputStream("neoquest_2014_original"); // нужен полный путь к файлу
    localFileOutputStream.write(arrayOfByte2);
    localFileOutputStream.close();
  }
}

В папке появился новый файл, это картинка формата JPEG. Добавим расширение и увидим ключ для прохождения задания.

Расшифрованный файл