NeoQuest 2014 (Hasta la vista)
Дан файл MyGreenManController. С помощью утилиты file, смотрим, что это такое.
user@userpc:~$ 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. Добавим расширение и увидим ключ для прохождения задания.
