Alyosha found this mobile phone on the floor of a small red hall. He was still working. Lua interpreter? Seriously?

Перед нами обычный интерпретатор Lua (если такое вообще можно назвать обычным — кажется, результат команд он не выводит).

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

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

На ввод он практически не реагирует — иногда лишь выводит фейковый флаг, поэтому посмотрим саму apk’шку.

Java

Декомпилируем apk с помощью jadx.

MainActivity. В принципе, ничего интересного.

MainActivity. В принципе, ничего интересного.

У нас имеется:

Ничего полезного не видно, погружаемся глубже.

Native

Вытаскиваем из apk libnative-lib.so. Открываем в IDA Pro. Я какое-то время пытался проследить всю логику, начиная от функции stringFromJni, но потом решил посмотреть строки.

почти полный флаг, за исключением двух частей

почти полный флаг, за исключением двух частей

Смотрим xref’ы…

да, я реверсил arm64, а потом вспомнил, что у меня эмулятор x86

да, я реверсил arm64, а потом вспомнил, что у меня эмулятор x86

Мы попали в какую-то функцию, которая генерирует недостающие куски флага и пушит флаг в стек Lua. Если пробежаться по xref’ам ещё выше, то станет ясно, что эта функция регистрируется как обработчик Lua-функции flag(). Сначала я хотел проэмулировать эту функцию через flare-emu, но выяснилось, что она зависит от какого-то стейта, который генерируется раньше. Поэтому я просто накидал небольшой скрипт под frida, который трейсит вызов функции lua_pushfstring.

Трейсим

Собственно скрипт: