Добро пожаловать путник. Готовим печеньки с чайком и погнали.
Для начала, разберёмся с самим заданием:
"Эльфы создали своё приложение под зелёного робота. Я смог разобрать его, но докопаться до сути - нет. Но точно одно: разобранный вариант - это какой-то смали. Хоть и всё на эльфийском."
Что бросается в глаза:
1) "Эльфы создали своё приложение под зелёного робота' - Приложение, сделанное под android
2) "Я смог разобрать его" - т.е. его декомпилировали и получили какой-то смали (smali). Быстрая гуглёжка показала, что SMALI - Формат ассемблерного языка Android Smali. Ok.
В данном задании нам предоставлены несколько файлов:
Все основные "штуки" всегда начинаются в Main.
Смотрим файл MainActivity.smali и ничего не понимаем. Поэтому Гугл + Чат GPT.
Интернет сказал, что в этом файле код представляет собой аннотацию @Metadata, которая содержит информацию о классе `MainActivityKt` настройку и установку контента активности с использованием Compose UI и заданных функций и параметров.
И долго не думая, лезем в файл MainActivityKt.smali, проанализировав который, нам становится понятно следующее:
1) В нём определяется класс MainActivityKt, который содержит единственный метод byteArrayToString.
2) Метод byteArrayToString принимает два параметра: массив байтов и значение байта для ключа XOR.
3) Выполнение операции XOR между значениями переменных v6 и p1, преобразование результата в байт и сохранение его в переменную v8
4) Преобразование значения переменной v8 в символ и добавление его в конец StringBuilder v0.
5) Преображение содержимого StringBuilder v0 в строку и сохранение результата в переменную v1.
Теперь, если смотреть на весь файл получаем, что:
Метод byteArrayToString объявлен как public static Final, что означает, что это статический метод, который не может быть переопределен подклассами.
Он принимает два параметра: input, который представляет собой массив байтов, и xorKey, который представляет собой байтовое значение для ключа XOR.
Метод сначала проверяет, имеет ли входной массив значение NULL, и, если это так, выдает исключение.
Затем метод создает новый объект StringBuilder для хранения результата.
Затем метод перебирает входной массив, используя цикл for-each. Для каждого байта в массиве метод выполняет операцию XOR с помощью xorKey и добавляет полученный байт в StringBuilder.
После завершения цикла метод возвращает строковое представление StringBuilder.
Уф... Вроде бы стало понятно. Но теперь появились вопросики:
1) Где взять входной массив?
2) Кто-нибудь видел xorKey?
Отвечаем на свои же вопросы. Открываем оставшиеся файлы *.smali в файле ComposableSingletons$MainActivityKt$lambda-1$1.smali видим это:
Чем не массив байт? Будем считать, что на первый вопрос ответили. P.S. пусть вас не смущает буква t, позже мы поймём, что с ней сделать
С вторым вопросом пришлось возиться дольше. Но, вернувшись к "истокам" (к файлу MainActivityKt.smali) мы видим код:
Видишь xorKey? Нет? А он есть и это строчка: const/4 p1, 0x7
Теперь, имея на руках все "ингредиенты", накидываем от руки скрипт, который сделает эльфийскую магию.
Не знаю почему, но задание настолько понравилось, что именно по нему решил написать writeup. Хоть я и не силён в реверсе.
Спасибо что дочитал до конца бро. Удачи в тасках.
Для начала, разберёмся с самим заданием:
"Эльфы создали своё приложение под зелёного робота. Я смог разобрать его, но докопаться до сути - нет. Но точно одно: разобранный вариант - это какой-то смали. Хоть и всё на эльфийском."
Что бросается в глаза:
1) "Эльфы создали своё приложение под зелёного робота' - Приложение, сделанное под android
2) "Я смог разобрать его" - т.е. его декомпилировали и получили какой-то смали (smali). Быстрая гуглёжка показала, что SMALI - Формат ассемблерного языка Android Smali. Ok.
В данном задании нам предоставлены несколько файлов:
Все основные "штуки" всегда начинаются в Main.
Смотрим файл MainActivity.smali и ничего не понимаем. Поэтому Гугл + Чат GPT.
Интернет сказал, что в этом файле код представляет собой аннотацию @Metadata, которая содержит информацию о классе `MainActivityKt` настройку и установку контента активности с использованием Compose UI и заданных функций и параметров.
И долго не думая, лезем в файл MainActivityKt.smali, проанализировав который, нам становится понятно следующее:
1) В нём определяется класс MainActivityKt, который содержит единственный метод byteArrayToString.
2) Метод byteArrayToString принимает два параметра: массив байтов и значение байта для ключа XOR.
3) Выполнение операции XOR между значениями переменных v6 и p1, преобразование результата в байт и сохранение его в переменную v8
4) Преобразование значения переменной v8 в символ и добавление его в конец StringBuilder v0.
5) Преображение содержимого StringBuilder v0 в строку и сохранение результата в переменную v1.
Теперь, если смотреть на весь файл получаем, что:
Метод byteArrayToString объявлен как public static Final, что означает, что это статический метод, который не может быть переопределен подклассами.
Он принимает два параметра: input, который представляет собой массив байтов, и xorKey, который представляет собой байтовое значение для ключа XOR.
Метод сначала проверяет, имеет ли входной массив значение NULL, и, если это так, выдает исключение.
Затем метод создает новый объект StringBuilder для хранения результата.
Затем метод перебирает входной массив, используя цикл for-each. Для каждого байта в массиве метод выполняет операцию XOR с помощью xorKey и добавляет полученный байт в StringBuilder.
После завершения цикла метод возвращает строковое представление StringBuilder.
Уф... Вроде бы стало понятно. Но теперь появились вопросики:
1) Где взять входной массив?
2) Кто-нибудь видел xorKey?
Отвечаем на свои же вопросы. Открываем оставшиеся файлы *.smali в файле ComposableSingletons$MainActivityKt$lambda-1$1.smali видим это:
Чем не массив байт? Будем считать, что на первый вопрос ответили. P.S. пусть вас не смущает буква t, позже мы поймём, что с ней сделать

С вторым вопросом пришлось возиться дольше. Но, вернувшись к "истокам" (к файлу MainActivityKt.smali) мы видим код:
Видишь xorKey? Нет? А он есть и это строчка: const/4 p1, 0x7
Теперь, имея на руках все "ингредиенты", накидываем от руки скрипт, который сделает эльфийскую магию.
P.S. Помните букву t? Мы просто её удаляем и у на с получается красивый массив.Python:def byteArrayToString(input_byte, xorKey): if input is None: raise ValueError("Err: null input") result = [] for byte in input_byte: xorResult = byte ^ xorKey char = chr(xorResult) result.append(char) return "".join(result) def main(): input_byte = [0x44, 0x48, 0x43, 0x42, 0x45, 0x5e, 0x7c, 0x74, 0x6a, 0x47, 0x6b, 0x6e, 0x58, 0x64, 0x37, 0x63, 0x42, 0x58, 0x61, 0x37, 0x55, 0x58, 0x66, 0x69, 0x43, 0x75, 0x37, 0x6e, 0x63, 0x7a] xorKey = 0x7 result = byteArrayToString(input_byte, xorKey) print(result) if __name__ == '__main__': main()
Не знаю почему, но задание настолько понравилось, что именно по нему решил написать writeup. Хоть я и не силён в реверсе.
Спасибо что дочитал до конца бро. Удачи в тасках.
Вложения
Последнее редактирование: