LeetD3vM4st3R

в 22:12, , рубрики: android, apk, apktool, информационная безопасность, Разработка под android, реверс, реверс-инжиниринг, реверс-инжиниринг для новичков

В APK находится функционал по генерации сигнатуры для ассоциативного массива. Постарайтесь получить подпись для следующего набора данных:

{
    "user" : "LeetD3vM4st3R",
    "password": "__s33cr$$tV4lu3__",
    "hash": "34765983265937875692356935636464"
}

и отправить результат @****** в Telegram.

-----------------------------------------------------------------------

В случае, если вам не удается решить данное задание, но вы преодолели уже какой-то путь, то отправьте @****** список проделанных вами шагов: нам, в первую очередь, интересен ход ваших мыслей как исследователя ПО ;)


HR каким-то образом нашел меня, звонил мне 6 раз, писал в телеграм, стучал в двери, и когда я наконец ответил, он обрадовался и вручил мне этот текст с прикрепленным файлом. Надо сказать, что резюме я оформил так знатно, что даже Илон Маск бы мной заинтересовался и вызванивал. Кстати почему он до сих пор не звонит?

О компании

Компания крутая. Я часто видел от них статьи на Хабре, пользовался их приложением и давным давно заходил на один их сервис пару раз. Особого внимания не обращал никогда. HR скинул мне их видос на ютубе с Литвиным, как они взломали Яндекс, и я остался впечатлен. Почему я раньше не знал, что та программа и тот сервис — их рук дело и не замечал их логотип читая 3 года назад те статьи? И почему этот видос на канале Литвина приватный? Компания как-будто бы появилась из ниоткуда, но как-будто бы всегда была в моей памяти. Как в одном фильме из 2049 года тебе внедряют воспоминания которых никогда не было, но теперь кажется что они всегда были.

Примерно в тот же день когда я просмотрел ролик про взлом Яндекса, мне написал руководитель антифрода Яндекса, что им очень нужен серьезный специалист. Интересно, связано ли это с их проделкой.

Вернёмся к заданию

Меня удивило, что крутая компания с зарплатой намного выше рынка (400к рублей в месяц) предоставила тестовое, решающееся за 15 минут. Ещё больше я удивился когда узнал, что некоторые не могут его решить, с одним парнем я познакомился — он написал статью на Хабре как у него не получилось, сейчас у него всё оки, работает в мейлру. Мне всё же не верится, что у него не получилось, это же не может не получиться. Может, статья липа и его контакт в конце — один большой ханипот, чтоб понять кто из соискателей решил погуглить тестовое? Как думаете? :) Тем не менее попробую сам:

$ apkid revtest.apk
[+] APKiD 2.1.2
[*] revtest.apk!classes.dex
|-> compiler : dx

Никаких упаковщиков, всё просто.

$ apktool d revtest.apk

$ jadx revtest.apk -ds revtest/src -r

Просмотрим декомпилированный java-код. Я полностью восстановил переименованные дексгардом классы и переменные, дал им осмысленные имена. На то чтобы переименовать все com.a.a.a.a.a в com.my.super.duper.hexEncoder, com.b.b.b.b.b во что-то ещё, и так далее, у меня ушло около получаса, но можно было это вообще не делать. Мне просто захотелось. Заметил вызовы JNI — это вызовы C++-библиотек из Java. Открыл единственную библиотеку libcipher-lib.so в IDA, декомпилировал и восстановил код, эта библиотека хранила две зашифрованные строки и выдавала их в расшифрованном виде по запросу, в чём её секьюрность я не понял, но нашел её гитхаб. Там в одном issue человек взял и всем рассказал как её ломать, вместо того чтобы написать разработчику на почту. Некрасиво. Но мне не пригодилось.

Смотря на исходный код и сравнивая его со smali, я закомментировал проверки в smali мешающие решению задания. Одна не даёт ввести user, другая символ $, третья обработать конкретный хеш:

#if-eqz v3, :cond_X
#new-array p1, v1, [B
#return-object p1

И думал что на этом всё закончится и я получу ответ, но нет, каждый раз когда я заново подписываю приложение — результат разный. Конечно, я уже восстановил, несколько раз перелоппатил и отрефакторил весь декомпилированный код и понимаю в чём проблема. Строка instance.update(a.b((Context) this.b.get())); добавляет к данным подпись приложения, надо её достать и захардкодить.

Собираюсь отлаживать апк в Intellij IDEA с плагином Smalidea. И вижу что в манифесте уже стоит android:debuggable="true", зачем?

Запускаю в отладчике com.asen.revtest.MainActivity.a(com.asen.revtest.a.b(this.b.get())), получаю подпись изначального apk:

308202B9308201A1A003020102020430BE77FE300D06092A864886F70D01010B0500300D310B300906035504061302454E301E170D3138313031333135303731315A170D3433313030373135303731315A300D310B300906035504061302454E30820122300D06092A864886F70D01010105000382010F003082010A028201010096C736E7ED6776291B50B6670FD64F69E7FF55B7CC1AFDE1DEF47CB60A65723FCAF7F12D216400A61FC71C25AA341D7754A7192A595C60EECA70A9B4A1B85D7EF13CDB0DBFC60F1C9941AB68B69B419BC3F1C4CFC1A0BCA7784F058AFAAEE7B70DA995C71672BA0686248D968BE66F0CFB750F0BD2FBF63371F3B6EB9E9003569393473A3DA9440D4F27825A487D328AD8E9F4642B6AD293F9608A36984A60B7A6D098049D9E4D0F29DBA76973DBA81ED4B921E666B87B1C814BD6D77A7CDBBF89E962FE661B744279A66E2D52AA11BA1C2882D0A8722EDE1DACEE3C8213B165B4844AF0A0B4BAC82F5E850038C6CE47559C3263ECF3BB5DE69B2AAD8A6938110203010001A321301F301D0603551D0E0416041487DA5544CA58C52E9B57D71422FE366CC47651D5300D06092A864886F70D01010B05000382010100673F738DB56E951E70E2FE595F3565CBC365B11E88497EA46DBD4DD0D73D3008FA88B50C893A1CCE999E68AA51DAB73E0E400FAD8986E6F25D960366F9B2E1F7C01362B6BEF1D0247114ACFE6BD07DE3C21948EDF674AC31A464761D6B08D60BD3D88B057B79D5CC3B112D8779EFB88E073A44A05DEE9E8928A98B92C868FFED8D2D8F6D5408808D3681C5D4D214349183C039865EB8936866558A8CE242589C6C15359703156CBFEEBAD2F4421633841A045532A15AEEB37874B0DB245641D829ED39123BA6ED300FCF39B485A5B92E99ADB7B753948E5D7AEB632239D86D0DC76E10060360159448483A96A7CDCB4555B6C3B2B126587DD46F64FB67AB1F3B

Ранее нашел в коде вот эти два метода, очень полезные:
org.a.a.a.a.a(char[] hex) — HEX string to B[ (byteArray)
com.asen.revtest.MainActivity.a(byte[] bytes) — B[ to HEX string

Можно было воспользоваться Base64 encode/decode, а я решил взять эти, HEX же круче.

В Smali я то, что было в Java строкой
instance.update(a.b((Context) this.b.get()));
заменяю на
instance.update(org.a.a.a.a.a("308202B9308201A1A00..."));

И собираю апк:

$ apktool b revtest/ -o revtest-patched.apk

$ keytool -genkey -keyalg RSA -alias who -keystore ks.keystore -validity 10000 -keysize 2048

$ jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore ks.keystore revtest-patched.apk who

$ adb install revtest-patched.apk

Ввожу в эмуляторе

user:       LeetD3vM4st3R
password:   __s33cr$$tV4lu3__
hash:       34765983265937875692356935636464

И всё. Ответ получен. Отправил его анониму с ником @*******

Мне дают второе тестовое задание, предлагающее ответить на несколько вопросов из жизни. Сделать его нужно очень быстро, 24 часа на размышления. А вопросы такие, что надо очень хорошо и долго думать. Мало кто сообразит, что на самом деле суть не в его выполнении, тест с подвохом ;)

Квест пройден. Мне предложили оффер.

С зарплатой втрое меньше, чем обсуждали. Потому что я не очень сильный специалист, и, честно говоря, это правда, я не Senior, но ведь вы нашли того самого человека, которого искали. Большая цифра в вакансии оказалась для красного словца. Я отказался. И «легенда» о возникновении компании не внушила мне доверия: создатель компании сделал очень популярное приложение, за счёт него финансирует команду, какое — секрет. Я с ним пообщался лично, он ничего не понимает в программировании и не знает, что такое SHA. А единственное приложение, которое я у них видел — нонпрофитное. Чем занимается сейчас компания — тоже секрет, NDA, мне не рассказали. А ещё там запрещены тату, пирсинг, курение и футболки с коротким рукавом. Футболки с коротким рукавом?

Автор:
vadimszzz

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js