PDA

Просмотр полной версии : Writeup: "Android UnCrackable L2" (mas.owasp.org)


Don Reverso
27.07.2024, 02:40
Название: Android UnCrackable L2

Категория: reverse (android)

Платформа: mas.owasp.org
Примечание от автора:


This app holds a secret inside. May include traces of native code.


Продолжение серии райтапов на небольшие андроид-крякмисы от OWASP! Сегодня будем разбирать второй уровень, райтап на первый советую посмотреть тут (https://forum.antichat.xyz/threads/1643733/), сегодня автор часто будет на него ссылаться.

Итак, наша задача - достать "секрет" из приложения, что бы под ним не подразумевалось. Попробуем запустить его (я буду использовать рутированное устройство):

https://forum.antichat.xyz/attachments/29113143/1722031747289.png

Как и на прошлом уровне, наше приложение детектит наличие рута на устройстве. Единственное различие - оно сразу же вылетает после этого виджета (поверьте, я минуту пытался успеть его заскринить XD). Как и в прошлый раз, я воспользуюсь плагином Magisk'а для скрытия рута от приложения - DenyList:

https://forum.antichat.xyz/attachments/29113143/1722031863337.png

Получилось! Видимо, в этом уровне авторы не стали улучшать прошлые механизмы обнаружения прав суперпользователя. Нам же лучше - теперь можно свободно потыкать приложение: в распоряжении имеется поле для ввода текста, кнопка проверки и благодарность авторам. По традиции попытаем удачи:

https://forum.antichat.xyz/attachments/29113143/1722031975699.png

Эх, опять не повезло... Ладно, тогда займёмся делом - закинем наш apk в JADXи сразу же заглянем в MainActivity:

https://forum.antichat.xyz/attachments/29113143/1722032061076.png

Как и в прошлый раз, здесь есть проверка на наличие рута. Функции здесь точно такие же, как в прошлом уровне: несколько тривиальных проверок на наличие бинарника suи связанных с ним файлами, и проверка ядра на test-keys. А вот с дебаггингом неловко вышло: в прошлой статье я принял 34-ю строчку за защиту от дебаггинга - оказалось, что это лишь уведомление, а защита, появившаяся в этом крякмисе, будет дальше:

https://forum.antichat.xyz/attachments/29113143/1722032277891.png

Но мы народ простой: сначала пойдём лёгким путём - простой статикой, а если не получится, то уже будем пытаться дебажить. Давайте посмотрим на что-то, что связано с нашим полем для ввода строки:

https://forum.antichat.xyz/attachments/29113143/1722032362323.png

Секрет нашего будущего успеха весьма банален: он заключается вthis.m.a(obj), а если быть точнее, в результате работы этой функции, получаемую на вход нашу строку. Заглянем в функцию a():

https://forum.antichat.xyz/attachments/29113143/1722032451568.png

Э... Что-то тут не то, не так ли? Этого явно недостаёт до проверки нашей строки. Раз с функцией a() мы прогорели, то заглянем в класс m, может, там будет что-то интересное:

https://forum.antichat.xyz/attachments/29113143/1722032535189.png

А вот с этим уже можно работать! Судя по всему, у нас загружается некая библиотека foo, в которой присутствует интересующая нас функция проверки. И если поискать в ресурсах приложения, мы, в конечном итоге, действительно наткнёмся на эту библиотеку:

https://forum.antichat.xyz/attachments/29113143/1722032630043.png

Побайтово её прочитать, увы, не получится. Но на то мы и ревёрсеры (по крайней мере, я пытаюсь им казаться), не так ли? Загрузим эту библиотеку в IDA.

https://forum.antichat.xyz/attachments/29113143/1722032688771.png

Перед вами список всех функций, обнаруженных декомпилятором. При ревёрсе всегда важно помнить контекст ваших действий; и наш, в данном случае - поиск функции, отвечающий за проверки введённой строки на правильность. Согласитесь, лучше всего для нас подойдёт маячащая в списке _strncmp, не правда ли? Посмотрим, где идёт обращение к этой функции:

https://forum.antichat.xyz/attachments/29113143/1722032827466.png

https://forum.antichat.xyz/attachments/29113143/1722032905861.png

Самый сок! Согласитесь, выглядит вполне подходяще - загрузка строки в v4и последующее сравнение v4с v6, где фигурирует число 23- длина этой строки. Давайте попробуем ввести её в приложении:

https://forum.antichat.xyz/attachments/29113143/1722033005338.png

Получилось, второй уровень пройден! Имхо, совру, если скажу, что было нелегко, но планка сложности постепенно поднимается - появился какой-никакой антидебаггинг и сторонняя библиотека.

И ещё, дорогие пытливые читатели, напоминаю, что статический анализ - далеко не единственный способ решать такие крякмисы; вы всегда можете попробовать что-то своё (например, Frida, XPosedи т.д.) и поделиться своим решением: уверен, остальным будет интересно, если не ещё интереснее =]

Надеюсь, этот небольшой райтап поможет вам в нашей нелёгкой стезе.

Удачного ревёрса!

made 4@rev_with_da_boys