В 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)


  1. Imbecile
    18.08.2021 07:21
    +4

    Странно, что с таким финалом, название компании всё ещё скрыто.

    А вообще, нет ощущения обмана после такого процесса отбора?


    1. vadimszzz Автор
      18.08.2021 13:06

      Вообще-то сложно сказать. Я себя не оцениваю на 400к, я достоин той зп которую в итоге предложили.

      Но. Во-первых, HR 10 раз повторил, что цифра указана минимальная «от», и что меньше быть не может, они готовы с удовольствием платить. Но HR зеленый стажер, работает там 3 месяца, он ниче не соображает.

      Во-вторых, у меня было 3 компании, с которыми близились офферы и все предлагали примерно одинаковую оплату. Не было смысла выбирать эту компанию, она выгодно выделялась только по зп, а в итоге оказалось что не выделялась. Еще и условия труда там очень кринжовые, рассказывать подробно не буду.


    1. vadimszzz Автор
      18.08.2021 14:34
      +1

      Складывается впечатление что компания подбирает стажеров и заманивает большой цифрой. Самый обычный наеб.


  1. onyxmaster
    18.08.2021 08:20
    +3

    Может это «Царьград» :)


  1. a-tk
    18.08.2021 08:24
    +1

    Honeypot не работает, поэтому решили написать статью - honeypot второго порядка? Что-то здесь не так.


  1. Bo0oM
    18.08.2021 08:31
    +3

    О, знакомая в узких кругах компания)

    В чатиках много отзывов и весёлостей оттуда. А еще там платят чеканным биткойном, могут спросить за политику, и еще много-много всего :)


    1. Neikist
      18.08.2021 13:24

      Угу, тоже в чатиках встречал. Название, увы, не помню, но владельцы/владелец и многие сотрудники мусульмане вроде как. Оттого и правила такие мутные.


      1. vadimszzz Автор
        18.08.2021 13:49

        Я был готов работать в такой кринжовой компании за большие деньги. Но не за копейки.

        А то что не курят это очень хорошо. И собственный повар. Там неплохо если подумать.


        1. Neikist
          18.08.2021 14:13
          +2

          Ну хз, как по мне работать с религиозными фанатиками (любой религии) очень такое себе даже за повара и большую зарплату.


    1. Rumata888
      18.08.2021 19:42

      В Linkedin как-то мелькал пост с перепиской с их HR, когда у сосискателя спрашивали, по-прежнему ли у него на теле тату. Видимо, думали, что сведет ради них.


  1. Ubudragon
    18.08.2021 12:30
    +2

    В чем проблема раскрыть эту "мутную" контору? nda не было, Религия не позволяет? )


    1. xzizt
      05.09.2021 16:48

      +


  1. abbath0767
    18.08.2021 17:53
    +4

    Готов поспорить что это компания с именем начинающееся на P, а заканчивающаяся на ostuf


    1. audiserg
      25.08.2021 16:31

      Она самая! Первую задачку я тоже решил,правда немного другим методом, а вот во втором тесте не понял в чем пресловутый "подвох", видимо в том что его вообще делать не надо. Оффер не получил, да оно и лучше даже.