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. Добавим расширение и увидим ключ для прохождения задания.