Codeby Games Writeup: "Эльфийский смали" (codeby.games)

  • Название: Эльфийский смали
  • Категория: reverse
  • Платформа: codeby.games
В архиве нас ждут несколько файлов с расширением .smali:

1720517863791.png


Для справки: smali - это своего рода аналог ассемблера для android-приложений. А те, кто знаком с разработкой таковых на Java, могли уже заметить знакомый MainActivity.

Если вы знаете smali и хотите узнать, как этот таск можно было решить, не переводя код в java - на форуме уже есть такой райтап. Мы же воспользуемся технологиями нашего времени и переведём этот smali-код в Java, и поможет нам в этом утилита JADX (gui-версия). Она есть как на Windows, так и на Linux, гитхаб прилагаю. Вообще - очень полезная тулза при ревёрсе android-приложений, в многочисленных функциях которой есть перевод smali в эквивалентный Java.

Открываем в ней эти 6 файлов:

1720518244059.png


В MainActivity ничего особо интересного не наблюдается, так что теперь заглянем в MainActivityKt:

1720518345114.png


А вот здесь уже можно заметить довольно интересную переменную - xorKey. Судя по всему, в функции byteArrayToString передаваемый массив байт ксорится с этим ключом, и на выходе получается зашифрованная/расшифрованная строка. А чуть выше, в byteArrayToString$default можно найти некоторое условие с двумя переменными (их я переименовал в соответствие со следующим скриншотом), через которое определяется сам xorKey и вызывается предыдущая функция. Попробуем поискать вызов этой самой byteArrayToString$default:

1720520115076.png


А вот и сам вызов, в 27 строке! Первым аргументом у нас передаётся какой-то массив байт, вторым - 0 (num_0 с предыдущего скриншота), который потом заменится на 7, затем - 2 (num_2) - число, которое удовлетворит проверке. И в конечном итоге этот набор байт поксорится с числом 7. Напишем простенькую программу на питоне:

Python:
secret = "68, 72, 67, 66, 69, 94, 124, 116, 106, 71, 107, 110, 88, 100, 55, 99, 66, 88, 97, 55, 85, 88, 102, 105, 67, 117, 55, 110, 99, 122"
secret = secret.split(", ")
secret = [chr(int(i) ^ 7) for i in secret]
print("".join(secret))

Запустим её:

1720520432097.jpeg


Получили флаг, сработало!
Надеюсь, этот небольшой райтап поможет вам в нашей нелёгкой стезе.

Удачного ревёрса!

made 4 @rev_with_da_boys
 
Мы в соцсетях:

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