ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Writeup: "Эльфийский смали" (antichat) (https://forum.antichat.xyz/showthread.php?t=1643651)

Don Reverso 09.07.2024 14:27

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

https://forum.antichat.xyz/attachmen...0517863791.png

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

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

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

https://forum.antichat.xyz/attachmen...0518244059.png

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

https://forum.antichat.xyz/attachmen...0518345114.png

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

https://forum.antichat.xyz/attachmen...0520115076.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
)
)

Запустим её:

https://forum.antichat.xyz/attachmen...0520432097.png

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

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

made 4@rev_with_da_boys


Время: 07:51