• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Эльфийский смали [Writeup]

Добро пожаловать путник. Готовим печеньки с чайком и погнали.

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

Что бросается в глаза:
1) "Эльфы создали своё приложение под зелёного робота' - Приложение, сделанное под android
2) "Я смог разобрать его" - т.е. его декомпилировали и получили какой-то смали (smali). Быстрая гуглёжка показала, что SMALI - Формат ассемблерного языка Android Smali. Ok.

В данном задании нам предоставлены несколько файлов:
1709551249336.png


Все основные "штуки" всегда начинаются в Main.

Смотрим файл MainActivity.smali и ничего не понимаем. Поэтому Гугл + Чат GPT.
Интернет сказал, что в этом файле код представляет собой аннотацию @Metadata, которая содержит информацию о классе `MainActivityKt` настройку и установку контента активности с использованием Compose UI и заданных функций и параметров.

И долго не думая, лезем в файл MainActivityKt.smali, проанализировав который, нам становится понятно следующее:

1) В нём определяется класс MainActivityKt, который содержит единственный метод byteArrayToString.
2) Метод byteArrayToString принимает два параметра: массив байтов и значение байта для ключа XOR.
1709552803490.png


3) Выполнение операции XOR между значениями переменных v6 и p1, преобразование результата в байт и сохранение его в переменную v8
1709554072970.png


4) Преобразование значения переменной v8 в символ и добавление его в конец StringBuilder v0.
1709554085575.png


5) Преображение содержимого StringBuilder v0 в строку и сохранение результата в переменную v1.
1709553863916.png


Теперь, если смотреть на весь файл получаем, что:
Метод 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 видим это:

1709554465068.png

Чем не массив байт? Будем считать, что на первый вопрос ответили. P.S. пусть вас не смущает буква t, позже мы поймём, что с ней сделать ;)
С вторым вопросом пришлось возиться дольше. Но, вернувшись к "истокам" (к файлу MainActivityKt.smali) мы видим код:

1709554941560.png


Видишь xorKey? Нет? А он есть и это строчка: const/4 p1, 0x7
Теперь, имея на руках все "ингредиенты", накидываем от руки скрипт, который сделает эльфийскую магию.

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()
P.S. Помните букву t? Мы просто её удаляем и у на с получается красивый массив.
Не знаю почему, но задание настолько понравилось, что именно по нему решил написать writeup. Хоть я и не силён в реверсе.
Спасибо что дочитал до конца бро. Удачи в тасках.
 

Вложения

  • 1709553745946.png
    1709553745946.png
    2,7 КБ · Просмотры: 24
Последнее редактирование:
  • Нравится
Реакции: yetiraki

yetiraki

Cybercoliseum II
07.02.2023
52
90
BIT
232
Спасибо за райтап.
а можно было воспользоваться jadx-gui и читать java код.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!