Переведено by $talk3r для xss.pro
Оригинальная статья
Недавно я решил проблему в стиле CTF, где пользователю был предоставлена андроид игры (.apk) с целью найти флаг. Оказалось, что это была очень простая ретро-игра, в которой нужно было собрать все доступные ключи, чтобы получить флаг. Некоторые из ключей находились за пределами игровой зоны, поэтому единственным способом решения этой проблемы было более глубокое изучение файла .apk и понимание логики игры.
В приведенной ниже сводке я опишу один способ, как изменить существующий файл .apk, соответственно изменить исходный код приложения, рекомпилировать его и установить на эмуляторе Android. К счастью, код не был запутан таким инструментом, как ProGuard.
Информация об игре
Цель ретро-игры - собрать все ключи. Некоторые ключи спрятаны за внешними стенами или находятся за пределами игровой зоны. Фигурку Android в игре можно перемещать только с помощью кнопки передвижения. Чтобы сломать внутреннюю стену, игрок может положить бомбы, которые взорвутся через 3 секунды. Некоторые из внешних стен тоже разрушаемы.
Вступление
Есть разные способы, чтобы решить эту проблему. Я только сделал статический анализ содержимого .apk / исходного кода. Файл .apk представляет мобильное приложение, поскольку оно установлено на мобильном устройстве, и содержит все данные, необходимые для правильной работы (скомпилированный код, ресурсы, подпись, манифест и т. д.). Хорошо бы иметь базовые знания языка программирования Java (или аналогичного), чтобы понять логику игры.
Native Binaries
Поскольку для решения этой проблемы не требовался анализ собственного кода, эта тема выходит за рамки. Файлы общих объектов находятся в основном в папке
Существует множество инструментов с открытым исходным кодом для реверс-инжинеринга / тестирования приложений Android. Проверьте эти резюме здесь и здесь. Некоторые полезные инструменты для статического анализа:
Инструменты
apktool
Можно получить с веб-сайта Apktool и использовать для декомпиляции / рекомпиляции приложений и их ресурсов. Используя apktool, файл classes.dex преобразуется в язык-посредник smali. Код smali нелегко читать но все же можно понять, что делает приложение. apktool может декодировать ресурсы почти до первоначальной формы и восстанавливать их после внесения некоторых изменений.
jadx-gui
Загрузка файла .apk в jadx-gui дает возможность взглянуть на декомпилированные исходные коды Java и просмотреть различные классы / методы и т. д. Хотя код Java может быть не идеальным, но все же намного лучше, чем чтение smali код.
Очень интересная особенность jadx - поиск строки / символа и опция поиска использования. После загрузки файла .apk пользовательский интерфейс выглядит следующим образом:
Ссылки
https://github.com/skylot/jadx
https://github.com/skylot/jadx/wiki/jadx-gui-features-overview
Smali/Baksmali
В
smali.
Java — Dalvik Bytecode — Smali
Если цель состоит в том, чтобы внести изменения в исходный код, то модификацию можно выполнить в коде
Ссылки
https://github.com/JesusFreke/smali
https://bitbucket.org/JesusFreke/smali/downloads/
Dex2Jar
Этот инструмент работает аналогично jadx-gui. Он преобразует байт-код Dalvik в байт-код Java для дальнейшего анализа исходного кода Java. JD-GUI можно использовать как автономную графическую утилиту для отображения исходного кода Javа. Он поставляется предварительно установленным на Kali-Linux или вы можете получить его здесь.
ByteCode Viewer
Это удобный для пользователя пакет Java-анализа с открытым исходным кодом, похожий на Jadx. Настройки просмотра могут быть настроены. Это довольно круто - иметь для сравнения код Java и smali.
UI ByteCode Viewer
Ссылки
https://bytecodeviewer.com/
https://github.com/Konloch/bytecode-viewer/
APK контент
.apk package content
/classes.dex: содержит интересующую нас логику
/ assets / *: файлы, связанные с приложением (изображения и т. д.)
/ res / *: все ресурсы, которые не скомпилированы в resources.arsc
/ lib / *: нативные библиотеки, разделенные на специфичные для архитектуры подпапки
/ META-INF / *: метаданные APK, информация о подписи
/AndroidManifext.xml: манифест приложения (подробную информацию см. Ниже)
/resources.arsc: предварительно скомпилированные ресурсы (строки, цвета, стили и т. д.)
Начало работы со статическим анализом
Таким образом, как указано ниже, для получения флага важно получить доступ к исходному коду, что является простой задачей, поскольку у нас есть много инструментов с открытым исходным кодом, которые мы можем использовать. Просто примечание:
Давайте сначала посмотрим на исходный код, а затем необходимые шаги для выполнения.
Java-код:
После анализа кода становится совершенно ясно, где можно внести возможные изменения в код, чтобы легко получить флаг. Поскольку это файл
Кроме того, код дает представление о хранимых ключах и разрушаемых стенах:
Расположение разрушаемых стен:
layBomb function
Метод Thread.sleep () используется для приостановки выполнения основного потока на 3 секунды. Это функция, которой я буду манипулировать в файле
Как изменить скомпилированное приложение для Android
Я пришел к выводу, что проще всего было декомпилировать приложение, внести изменения в исходный код
Эмулятор
На моем Kali Linux я установил эмулятор Android SDK, чтобы протестировать игровое приложение.
Установка: sudo apt-get установить libgl1-mesa-dev. Смотрите подробное описание здесь.
Шаг за шагом
1 Декомпилируйте файл .apk с помощью apktool
Папка приложения будет создана, и все выходные данные apktool находятся там. Нас интересуют файлы smali и перейдите в соответствующую папку с файлами smali. В моем случае это: cd smali / de / mo / projekt / bomberman. Помните, что за капотом использовался бакшали!
2 На данный момент я точно знаю, какой файл smali я хочу изменить (вывод из моего статического анализа кода). Откройте файл smali с помощью любого простого редактора. (В моем случае это был BombermanActivity.smali).
3 Сделайте необходимые изменения в файлах smali. В моем случае я решил адаптировать время сна, чтобы играть в игру одним выстрелом (см. Также выше экран печати). Я изменил значение с 0xbb8 на 0x2328. ниже и сохранил файл.
Строка 2534: -> const-wide / 16 v6, 0xbb8
Строка 2535: ->
Строка 2536: ->: try_start_0
Строка 2537: -> invoke-static {v6, v7}, Ljava / lang / Thread; -> sleep (J) V
Строка 2538 <…>
4 Рекомпилируйте apk с помощью apktool b [имя папки] -o, модифицированного APK.apk. Имя папки было определено на шаге 1 (по умолчанию -> имя apk.file). Теперь у нас есть новый перекомпилированный apk-файл с измененным кодом smali (ifiedAPK.apk).
5 Мне пришлось создать сертификат и подписать измененный APK.apk, чтобы переустановить его на эмуляторе Android, так как после модификации контрольная сумма и подпись были недействительными. Обратите внимание, что содержимое папки META-INF может потребоваться удалить заранее.
6. После выполнения этих двух команд файлы CERT.RSA и CERT.SF должны были быть созданы в папке META-INF.
7. Установите измененный .apk на устройство, соответственно в Android Emulator, перетаскивая файл .apk.
8. Наслаждайтесь игрой и получите флаг. Теперь с измененным исходным кодом я могу легко играть в игру, поскольку взрыв бомбы задерживается на 6 секунд. Обратите внимание, что мы точно знаем, где хранятся ключи и какие стены могут быть разрушены из нашего обзора статического анализа (см. Выше). Обладая всей этой информацией, должно быть очень легко играть в игру до конца.
Конечно, кодом можно манипулировать в разных местах исходного кода, я просто решил изменить функцию времени ожидания, поскольку это простая замена в коде
Победа!)
Примечание 1: Конечно, также возможно получить содержимое из файла .apk и преобразовать только файл .dex в удобочитаемое представление, внести изменения и преобразовать обратно в .dex:
Примечание 2: Аpktool - более общий инструмент для декодирования и восстановления файла .apk. Он использует bak/smali под капотом. bak / smali для файлов DEX.
Ссылки
Как модифицировать .apk
Переупаковка APK файла с использованием baksmali и smali
Оригинальная статья
Недавно я решил проблему в стиле CTF, где пользователю был предоставлена андроид игры (.apk) с целью найти флаг. Оказалось, что это была очень простая ретро-игра, в которой нужно было собрать все доступные ключи, чтобы получить флаг. Некоторые из ключей находились за пределами игровой зоны, поэтому единственным способом решения этой проблемы было более глубокое изучение файла .apk и понимание логики игры.
В приведенной ниже сводке я опишу один способ, как изменить существующий файл .apk, соответственно изменить исходный код приложения, рекомпилировать его и установить на эмуляторе Android. К счастью, код не был запутан таким инструментом, как ProGuard.
Информация об игре
Цель ретро-игры - собрать все ключи. Некоторые ключи спрятаны за внешними стенами или находятся за пределами игровой зоны. Фигурку Android в игре можно перемещать только с помощью кнопки передвижения. Чтобы сломать внутреннюю стену, игрок может положить бомбы, которые взорвутся через 3 секунды. Некоторые из внешних стен тоже разрушаемы.
Вступление
Есть разные способы, чтобы решить эту проблему. Я только сделал статический анализ содержимого .apk / исходного кода. Файл .apk представляет мобильное приложение, поскольку оно установлено на мобильном устройстве, и содержит все данные, необходимые для правильной работы (скомпилированный код, ресурсы, подпись, манифест и т. д.). Хорошо бы иметь базовые знания языка программирования Java (или аналогичного), чтобы понять логику игры.
Native Binaries
Поскольку для решения этой проблемы не требовался анализ собственного кода, эта тема выходит за рамки. Файлы общих объектов находятся в основном в папке
lib и должны анализироваться с помощью дизассемблера, такого как ghidra / hopper или аналогичного.Существует множество инструментов с открытым исходным кодом для реверс-инжинеринга / тестирования приложений Android. Проверьте эти резюме здесь и здесь. Некоторые полезные инструменты для статического анализа:
Инструменты
apktool
Можно получить с веб-сайта Apktool и использовать для декомпиляции / рекомпиляции приложений и их ресурсов. Используя apktool, файл classes.dex преобразуется в язык-посредник smali. Код smali нелегко читать но все же можно понять, что делает приложение. apktool может декодировать ресурсы почти до первоначальной формы и восстанавливать их после внесения некоторых изменений.
jadx-gui
Загрузка файла .apk в jadx-gui дает возможность взглянуть на декомпилированные исходные коды Java и просмотреть различные классы / методы и т. д. Хотя код Java может быть не идеальным, но все же намного лучше, чем чтение smali код.
Очень интересная особенность jadx - поиск строки / символа и опция поиска использования. После загрузки файла .apk пользовательский интерфейс выглядит следующим образом:
Ссылки
https://github.com/skylot/jadx
https://github.com/skylot/jadx/wiki/jadx-gui-features-overview
Smali/Baksmali
В
bak/smali на самом деле используется apktool под капотом. С baksmali можно разобрать классы Java в редактируемые формы (smali). Для сборки всех классов в удобночитаемую форму для android (classes.dex) можно использоватьsmali.
Java — Dalvik Bytecode — Smali
Если цель состоит в том, чтобы внести изменения в исходный код, то модификацию можно выполнить в коде
smali.Ссылки
https://github.com/JesusFreke/smali
https://bitbucket.org/JesusFreke/smali/downloads/
Dex2Jar
Этот инструмент работает аналогично jadx-gui. Он преобразует байт-код Dalvik в байт-код Java для дальнейшего анализа исходного кода Java. JD-GUI можно использовать как автономную графическую утилиту для отображения исходного кода Javа. Он поставляется предварительно установленным на Kali-Linux или вы можете получить его здесь.
ByteCode Viewer
Это удобный для пользователя пакет Java-анализа с открытым исходным кодом, похожий на Jadx. Настройки просмотра могут быть настроены. Это довольно круто - иметь для сравнения код Java и smali.
java-jar Bytecode-Viewer-2.9.x.jar
UI ByteCode Viewer
Ссылки
https://bytecodeviewer.com/
https://github.com/Konloch/bytecode-viewer/
APK контент
.apk package content
/classes.dex: содержит интересующую нас логику
/ assets / *: файлы, связанные с приложением (изображения и т. д.)
/ res / *: все ресурсы, которые не скомпилированы в resources.arsc
/ lib / *: нативные библиотеки, разделенные на специфичные для архитектуры подпапки
/ META-INF / *: метаданные APK, информация о подписи
/AndroidManifext.xml: манифест приложения (подробную информацию см. Ниже)
/resources.arsc: предварительно скомпилированные ресурсы (строки, цвета, стили и т. д.)
Начало работы со статическим анализом
Таким образом, как указано ниже, для получения флага важно получить доступ к исходному коду, что является простой задачей, поскольку у нас есть много инструментов с открытым исходным кодом, которые мы можем использовать. Просто примечание:
Strings не показывает ни флаг, ни файл strings.xml в папке / res / values /. Для вывода всех XML-файлов (после декомпиляции) можно использовать find. -name \ *. xml.AndroidManifest.xml: это основной файл конфигурации, используемый всеми приложениями для Android. При обратном инжиниринге .apk манифест дает хорошую отправную точку для (i) информации для точки входа (сообщает нам, какие классы следует сначала изменить), (ii) действий, (iii) служб, работающих в фоновом режиме, (iv) разрешения уровни, (v) приемники и т. д.Давайте сначала посмотрим на исходный код, а затем необходимые шаги для выполнения.
Java-код:
После анализа кода становится совершенно ясно, где можно внести возможные изменения в код, чтобы легко получить флаг. Поскольку это файл
.smali, который нужно изменить, я выбрал функцию, которая позволяет мне сделать это простым способом -> изменить значение времени в функции сна. С этим изменением я продлил время взрыва бомбы в игре, что в итоге позволяет мне выиграть игру за один раз.
Кроме того, код дает представление о хранимых ключах и разрушаемых стенах:
addkeys(0.0f, 3.0f); //hidden behind outer wall
addkeys(-3.0f, 4.0f); //outside of game area
addkeys(13.0f, 1.0f); //outside of game area
addkeys(13.0f, 7.0f); //outside of game area
addkeys(5.0f, 5.0f);
addkeys(5.0f, 8.0f);
Расположение разрушаемых стен:
addDestroyableWall(3.0f, 1.0f);
addDestroyableWall(1.0f, 3.0f);
addDestroyableWall(1.0f, 4.0f);
addDestroyableWall(1.0f, 5.0f);
addDestroyableWall(1.0f, 6.0f);
addDestroyableWall(1.0f, 8.0f);
addDestroyableWall(4.0f, 1.0f);
...
layBomb function
Метод Thread.sleep () используется для приостановки выполнения основного потока на 3 секунды. Это функция, которой я буду манипулировать в файле
.smali.
public void layBomb(float x, float y) {
addBomb(x, y);
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
...
Как изменить скомпилированное приложение для Android
Я пришел к выводу, что проще всего было декомпилировать приложение, внести изменения в исходный код
smali и рекомпилировать его. Таким образом, важно заранее изучить Java-код и узнать, какие изменения необходимы.Эмулятор
На моем Kali Linux я установил эмулятор Android SDK, чтобы протестировать игровое приложение.
Установка: sudo apt-get установить libgl1-mesa-dev. Смотрите подробное описание здесь.
Шаг за шагом
1 Декомпилируйте файл .apk с помощью apktool
apktool d <application.apk>Папка приложения будет создана, и все выходные данные apktool находятся там. Нас интересуют файлы smali и перейдите в соответствующую папку с файлами smali. В моем случае это: cd smali / de / mo / projekt / bomberman. Помните, что за капотом использовался бакшали!
2 На данный момент я точно знаю, какой файл smali я хочу изменить (вывод из моего статического анализа кода). Откройте файл smali с помощью любого простого редактора. (В моем случае это был BombermanActivity.smali).
3 Сделайте необходимые изменения в файлах smali. В моем случае я решил адаптировать время сна, чтобы играть в игру одним выстрелом (см. Также выше экран печати). Я изменил значение с 0xbb8 на 0x2328. ниже и сохранил файл.
Строка 2534: -> const-wide / 16 v6, 0xbb8
Строка 2535: ->
Строка 2536: ->: try_start_0
Строка 2537: -> invoke-static {v6, v7}, Ljava / lang / Thread; -> sleep (J) V
Строка 2538 <…>
4 Рекомпилируйте apk с помощью apktool b [имя папки] -o, модифицированного APK.apk. Имя папки было определено на шаге 1 (по умолчанию -> имя apk.file). Теперь у нас есть новый перекомпилированный apk-файл с измененным кодом smali (ifiedAPK.apk).
5 Мне пришлось создать сертификат и подписать измененный APK.apk, чтобы переустановить его на эмуляторе Android, так как после модификации контрольная сумма и подпись были недействительными. Обратите внимание, что содержимое папки META-INF может потребоваться удалить заранее.
keytool -genkey -v -keystore my-release-key.keystore -keyalg RSA -keysize 2048 -validity 10000jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore modifiedAPK.apk
6. После выполнения этих двух команд файлы CERT.RSA и CERT.SF должны были быть созданы в папке META-INF.
7. Установите измененный .apk на устройство, соответственно в Android Emulator, перетаскивая файл .apk.
8. Наслаждайтесь игрой и получите флаг. Теперь с измененным исходным кодом я могу легко играть в игру, поскольку взрыв бомбы задерживается на 6 секунд. Обратите внимание, что мы точно знаем, где хранятся ключи и какие стены могут быть разрушены из нашего обзора статического анализа (см. Выше). Обладая всей этой информацией, должно быть очень легко играть в игру до конца.
Конечно, кодом можно манипулировать в разных местах исходного кода, я просто решил изменить функцию времени ожидания, поскольку это простая замена в коде
smali.
Победа!)
Примечание 1: Конечно, также возможно получить содержимое из файла .apk и преобразовать только файл .dex в удобочитаемое представление, внести изменения и преобразовать обратно в .dex:
baksmali d application.apk -o smaliClasses
smali a smaliClasses -o classes.dex Примечание 2: Аpktool - более общий инструмент для декодирования и восстановления файла .apk. Он использует bak/smali под капотом. bak / smali для файлов DEX.
Ссылки
Как модифицировать .apk
Переупаковка APK файла с использованием baksmali и smali