Статья Frida Framework vs Android p.2

Пред. Frida Framework vs Android p.1
След. Frida Framework vs Android p.3

Frida and Radare2: r2frida

Было бы неплохо, если бы мы могли использовать фрэймворк дизассеблирования, например для изучения памяти приложения. Здесь появляется r2frida. Вы можете использовать r2frida для подключения radare2 к Frida и проводить статический анализ и дизассеблировать память процесса. Я не буду вдаваться в подробности r2froda здесь, потому что он предполагает знаний Radare2 (на что совершенно точно следует посмотреть, если вы еще не сделали этого), но тем не менее, я хочу дать вам представление об его использовании.

Вы можете установит r2frida используя Radare2 packet management (кончено, если radare2 у вас уже установлен):
Код:
r2pm install r2frida
Вернитесь назад на пример с frida-trace, удалите или переименуйте наш измененный скрипт, теперь вывод будет такой же каким он был изначально:
Код:
michael@sixtyseven:~$ frida-trace -i open -U -f com.android.chrome
Instrumenting functions...                                          
open: Loaded handler at "/home/michael/__handlers__/libc.so/open.js"
Started tracing 1 function. Press Ctrl+C to stop.                   
           /* TID 0x2740 */
   282 ms  open(pathname=0xa843ffc9, flags=0x80002)
           /* TID 0x2755 */
   [...]
В r2frida вы можете легко вы можете посмотреть что лежит по выводимым адресам и прочитать путь, в данном случае /dev/binder.
Код:
root@sixtyseven:~# r2 frida://emulator-5556/com.android.chrome
-- Enhance your graphs by increasing the size of the block and graph.depth eval variable.
[0x00000000]> s 0xa843ffc9
[0xa843ffc9]> px
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0xa843ffc9  2f64 6576 2f62 696e 6465 7200 4269 6e64  /dev/binder.Bind
0xa843ffd9  6572 2069 6f63 746c 2074 6f20 6f62 7461  er ioctl to obta
0xa843ffe9  696e 2076 6572 7369 6f6e 2066 6169 6c65  in version faile
0xa843fff9  643a 2025 7300 4269 6e64 6572 2064 7269  d: %s.Binder dri
[...]
Синтаксис доступа к процессу и подключения r2frida:
Код:
r2 frida://DEVICE-ID/PROCESS
Также проверьте доступные команды r2frida, они доступны с помощью префикса =!, который помимо прочего позволяет вам быстро находить области памяти с требуемым содержимым или записывать по требуемым адресам.
Код:
[0x00000000]> =!?
r2frida commands available via =!
?                          Show this help
?V                         Show target Frida version
/[x][j] <string|hexpairs>  Search hex/string pattern in memory ranges (see search.in=?)
/w[j] string               Search wide string
[...]
Теперь, после знакомства с Frida в первой части, мы готовы к решению небольшого CrackMe используя Frida. После того что мы узнали о Frida это должно быть очень легко, ну теоретически. Если вы хотите повторять за мной, скачайте:
Кончено, я предполагаю, что вы уже установили Frida (версии 9.1.16 или позднее) на свой компьютере и запустили соответствующий frida-server на устройстве с правами супер-пользователя. Для этого руководства я буду использовать образ Android 7.1.1 ARM запущенный в эмуляторе.

Установите Uncrackable Crackme Level 1 на ваше устройство:
Код:
adb install sg.vantagepoint.uncrackable1.apk
Подождите пока он установится, затем запустите его (оранжевая иконка в правом нижнем углу):

IkO3Zlg.png


После запуска приложение сообщит, что не оно не работает на устройстве с правами супер-пользователя:

0xXPHO3.png


Если вы нажмете “ОК” приложение сразу же закроется. Хм. Нехорошо. Похоже мы не сможем решить CrackMe таким способом. А разве мы ожидали другого? Давайте разберемся что происходит, разберем как работает приложение внутри.

Сконвертируем APK в jar c помощью dex2jar:
Код:
michael@sixtyseven:/opt/dex2jar/dex2jar-2.0$ ./d2j-dex2jar.sh -o /home/michael/UnCrackable-Level1.jar /home/michael/UnCrackable-Level1.apk
dex2jar /home/michael/UnCrackable-Level1.apk -> /home/michael/UnCrackable-Level1.jar
Теперь загрузим файл а BytecodeViewer (или любой другой дизассемблер на ваш выбор, главное что бы он поддерживал Java). Вы также можете попробовать загрузить APK напрямую в BytecodeViewer или открыть его classes.dex, но у меня это не работало, поэтому я предварительно сконвертировал в jar с помощью dex2jar.

В BytecodeViewer выберете View->Panel 1->CFR->Java для использования CFR Decompiler. Вы можете включить отображение smali кода во втором окне (Panel 2) если вы хотите сравнивать вывод декомпилятора с дизассемблированным листингом (который зачастую точнее декомпилированного кода).

ddG8SAl.png


Вывод CFR Decompiler для MainActivity:
Код:
package sg.vantagepoint.uncrackable1;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import sg.vantagepoint.uncrackable1.a;
import sg.vantagepoint.uncrackable1.b;
import sg.vantagepoint.uncrackable1.c;

public class MainActivity
extends Activity {
    private void a(String string) {
        AlertDialog alertDialog = new AlertDialog.Builder((Context)this).create();
        alertDialog.setTitle((CharSequence)string);
        alertDialog.setMessage((CharSequence)"This in unacceptable. The app is now going to exit.");
        alertDialog.setButton(-3, (CharSequence)"OK", (DialogInterface.OnClickListener)new b(this));
        alertDialog.show();
    }

    protected void onCreate(Bundle bundle) {
        if (sg.vantagepoint.a.c.a() || sg.vantagepoint.a.c.b() || sg.vantagepoint.a.c.c()) {
            this.a("Root detected!"); //This is the message we are looking for
        }
        if (sg.vantagepoint.a.b.a((Context)this.getApplicationContext())) {
            this.a("App is debuggable!");
        }
        super.onCreate(bundle);
        this.setContentView(2130903040);
    }

    public void verify(View object) {
        object = ((EditText)this.findViewById(2131230720)).getText().toString();
        AlertDialog alertDialog = new AlertDialog.Builder((Context)this).create();
        if (a.a((String)object)) {
            alertDialog.setTitle((CharSequence)"Success!");
            alertDialog.setMessage((CharSequence)"This is the correct secret.");
        } else {
            alertDialog.setTitle((CharSequence)"Nope...");
            alertDialog.setMessage((CharSequence)"That's not it. Try again.");
        }
        alertDialog.setButton(-3, (CharSequence)"OK", (DialogInterface.OnClickListener)new c(this));
        alertDialog.show();
    }
}
Взглянув на остальные декомпилированные файлы, можно заметить, что приложение достаточно небольшое, и возможно, мы могли бы решить CrackMe просто разобрав алгоритм расшифровки и преобразования строк. Однако, после знакомства с Frida разве мы не можем сделать проще?

Всё не получается опубликовать одной статьёй, поэтому разбиваю на статьи по-мельче.
 
Мы в соцсетях:

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