В 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
И всё. Ответ получен. Отправил его анониму с ником @*******
Полезная сноска: для решения задачи я применил JEB Decompiler, apktool, jadx, cfr, IntellijIDEA+Smalidea, IDA Pro+retdec, советую так же использовать frida и A64dbg для более серьезных задач, для изучения этой несложной профессии обязательно прочитать HackTricks book, OWASP MSTG, шпаргалки по Smali и ARM.
Мне дают второе тестовое задание, предлагающее ответить на несколько вопросов из жизни. Сделать его нужно очень быстро, загадка от Жака Фреско, на размышления дается 24 часа. А вопросы такие, что надо очень хорошо и долго думать. Мало кто сообразит, что на самом деле суть не в его выполнении, тест с подвохом ;)
Квест пройден. Мне предложили оффер.
С зарплатой втрое меньше, чем обсуждали. Потому что я не очень сильный специалист, и, честно говоря, это правда, я не Senior, но ведь вы нашли того самого человека, которого искали. Большая цифра в вакансии оказалась для красного словца. Я отказался. И «легенда» о возникновении компании не внушила мне доверия: создатель компании сделал очень популярное приложение, за счёт него финансирует команду, какое — секрет. Я с ним пообщался лично, он ничего не понимает в программировании и не знает, что такое SHA. А единственное приложение, которое я у них видел — нонпрофитное. Чем занимается сейчас компания — тоже секрет, NDA, мне не рассказали. А ещё там запрещены тату, пирсинг, курение и футболки с коротким рукавом. Футболки с коротким рукавом?
Комментарии (14)
a-tk
18.08.2021 08:24+1Honeypot не работает, поэтому решили написать статью - honeypot второго порядка? Что-то здесь не так.
Bo0oM
18.08.2021 08:31+3О, знакомая в узких кругах компания)
В чатиках много отзывов и весёлостей оттуда. А еще там платят чеканным биткойном, могут спросить за политику, и еще много-много всего :)
Neikist
18.08.2021 13:24Угу, тоже в чатиках встречал. Название, увы, не помню, но владельцы/владелец и многие сотрудники мусульмане вроде как. Оттого и правила такие мутные.
vadimszzz Автор
18.08.2021 13:49Я был готов работать в такой кринжовой компании за большие деньги. Но не за копейки.
А то что не курят это очень хорошо. И собственный повар. Там неплохо если подумать.
Neikist
18.08.2021 14:13+2Ну хз, как по мне работать с религиозными фанатиками (любой религии) очень такое себе даже за повара и большую зарплату.
Rumata888
18.08.2021 19:42В Linkedin как-то мелькал пост с перепиской с их HR, когда у сосискателя спрашивали, по-прежнему ли у него на теле тату. Видимо, думали, что сведет ради них.
abbath0767
18.08.2021 17:53+4Готов поспорить что это компания с именем начинающееся на P, а заканчивающаяся на ostuf
audiserg
25.08.2021 16:31Она самая! Первую задачку я тоже решил,правда немного другим методом, а вот во втором тесте не понял в чем пресловутый "подвох", видимо в том что его вообще делать не надо. Оффер не получил, да оно и лучше даже.
Imbecile
Странно, что с таким финалом, название компании всё ещё скрыто.
А вообще, нет ощущения обмана после такого процесса отбора?
vadimszzz Автор
Вообще-то сложно сказать. Я себя не оцениваю на 400к, я достоин той зп которую в итоге предложили.
Но. Во-первых, HR 10 раз повторил, что цифра указана минимальная «от», и что меньше быть не может, они готовы с удовольствием платить. Но HR зеленый стажер, работает там 3 месяца, он ниче не соображает.
Во-вторых, у меня было 3 компании, с которыми близились офферы и все предлагали примерно одинаковую оплату. Не было смысла выбирать эту компанию, она выгодно выделялась только по зп, а в итоге оказалось что не выделялась. Еще и условия труда там очень кринжовые, рассказывать подробно не буду.
vadimszzz Автор
Складывается впечатление что компания подбирает стажеров и заманивает большой цифрой. Самый обычный наеб.