Содержание статьи
Многие из нас грезят об утечке в публичный доступ новой версии IDA, так как 6.1 уже немного устарела. Но некоторые не стали сидеть на месте и начали разрабатывать свой инструмент, помогающий в повседневной работе.
Intro
Небольшой экскурс в историю. Проект radare начал разрабатывать хакер с ником pancake в 2006 году, и долгое время, по сути, он был единственным разработчиком. Созданный фреймворк обладал простым консольным интерфейсом для работы как шестнадцатеричный редактор, поддерживающий 64-битную архитектуру. Это позволяло находить и восстанавливать данные с жестких дисков. Поэтому его еще называли инструментом для компьютерной криминалистической экспертизы. Но в 2010 год произошел «редизайн» фреймворка, после чего проект стал разрастаться и пополняться новым функционалом, позволяющим использовать его не только как редактор, но и как дизассемблер, анализатор и кода, и шелл-кодов. На данный момент этот фреймворк используют знаменитые CTF-команды (Dragon Sector) и вирусные аналитики (MalwareMustDie и AlienVault), причем последние представляют его на своем воркшопе на Black Hat. Достаточно большой список тех, кто использует radare2, с примерами представлен в блоге проекта.
В общем, не побоюсь этого слова, фреймворк тихими шагами догоняет нашу любимую (и довольно трудно получаемую) IDA. А пока рассмотрим его особенности, которые разработаны на данный момент.
Начнем с поддержки большого количества архитектур — есть даже для Gameboy, видео по анализу популярной игры Pokemon для которого опубликовал на канале YouTube один из исследователей, правда, на немецком языке.
Одна из особенностей — поддержка многих скриптовых языков. Помимо популярных Python с Perl, которые поддерживаются в других дизассемблерах, есть также Vala, Go, Guile, Ruby, Lua (о его плюсах и минусах я писал ранее), Java, JavaScript (Node.js и ducktape), sh и многие другие.
Также многим пригодится поддержка типов, особенно при анализе C++ программ. Достаточно создать *.h-файл с описанием и подключить его. Ниже я привел пример от автора фреймворка. Содержимое файла с описанием структуры:
[0x00000000]> cat test.h
#define uint32_t unsigned int
typedef struct addr {
char street[127];
char city[40];
uint32_t zip;
addr_t;
Подключаем файл и помечаем область со структурой:
[0x00000000]> to test.h
[0x00000000]> tl addr 0x4000
[0x00000000]> tf 0x4000
struct addr {
street : 0x00004000 = "Wallaby Way"
city : 0x00004000 = "Sydney"
zip : 0x00004008 = 2000
}
Существует поддержка отладки. Причем ты можешь проводить как прямую отладку, так и работу с протоколами gdb, winedbg.
Благодаря тому что фреймворком заинтересовались вирусные аналитики, появилась поддержка утилиты yara, о которой мы писали ранее. Помимо поддержки самой утилиты, было встроено много правил. Некоторые из них, например, позволяют определить большое количество упаковщиков. Ниже я привел такой пример для одного из сэмплов вредоносной программы:
[0x0040324d]> yara scan
dUP_v2_x_Patcher
Nullsoft_PiMP_Stub
Установка
Так как radare2 не является версией 1.0 (на момент написания статьи она была 0.9.8), разработчики советуют использовать свой фреймворк: скачать и собрать его из исходников с GitHub (заодно вспомним, как работать с Git):
$ git clone https://github.com/radare/radare2.git
Если же у тебя исходники были уже скачаны, то нужно их обновить следующей командой:
$ git pull
Для автоматической компиляции можешь воспользоваться встроенным скриптом:
$ sys/install.sh
Если же он выдал ошибку, то попробуй сделать вручную:
$ ./configure --prefix=/usr
$ gmake
$ sudo gmake install
Или вместо gmake используй утилиту make. Например, для OS X мне так и пришлось сделать. А после перезагрузки я увидел долгожданное окно (рис. 1):
Хакер #188. Ботнеты, изменившие мир
Также ты можешь поставить radare2 из macports или использовать утилиту homebrew, но там версии периодически отстают. По этой же причине, если ты используешь Kali Linux, советую удалить встроенный radare2 через утилиту apt-get и поставить фреймворк из исходников, как я описал выше.
Для Windows бинарный файл можно скомпилировать с помощью какой-либо *nix-платформы или воспользоваться mingw-компилятором.
Android-версия доступна в Google play, причем права root не требуются. Так как с помощью фреймворка можно анализировать и Java-файлы — об этом есть неплохая статья с примерами, то легко добавили поддержку APK-файлов. Ниже я покажу, как выглядят интерфейс программы (рис. 2) и дизассемблированный код.
В отличие от Android, на iOS-устройствах придется вначале сделать jailbreak, только после этого появится возможность установить фреймворк. Для этого нужно добавить репозиторий cydia.radare.org
в Cydia.
Хотя в некоторых случаях можно обойтись и без компиляции. Благодаря сервису СI есть возможность скачивать уже скомпилированные файлы под различные платформы, в том числе и для Windows. Например, именно поэтому Android-версия идет рука об руку с основной.
Теперь немного остановимся на доработке функционала. Чтобы отменить свои модификации исходников, вернемся к нормальной версии:
$ git reset --hard HEAD
Если же твои доработки, наоборот, исправили какую-то проблему, то помимо обычного commit можно сделать патч и отправить его разработчику:
$ git diff > radare-foo.patch
Теперь рассмотрим саму работу с фреймворком.
Обзор утилит
Помимо основной утилиты radare2 (к ней мы вернемся позже), рассмотрим набор программ, входящих в фреймворк, на примере простых операций, которые могут пригодиться исследователям.
Rasm2 — ассемблер/дизассемблер фреймворка, выполнен как отдельное приложение и позволяет дизассемблировать как бинарные, так и отдельные строки.
root@kali:~/# rasm2 -a x86 nop
90
root@kali:~/# rasm2 -a x86 -d 'eb00'
jmp 0x2
Обычным переводом опкодов туда и обратно, правда, мало кого удивишь, пусть и с поддержкой большого количества архитектур (рис. 3). Зато описание всех опкодов не всегда есть под рукой:
root@kali:~/# rasm2 -w cmpsb
cmp DS:[SI], ES:[edi] (esi++, edi++)
root@kali:~/# rasm2 -w sqrtpd
compute square roots of packed double-fp values
Также эта утилита может помочь при быстром анализе найденных шелл-кодов. Пример небольшого шелл-кода, который запускает /bin/sh
, представлен ниже:
root@kali:~/# rasm2 -d eb165e31d2525689e189f331c0b00bcd8031db31c040cd80e8e5ffffff2f62696e2f7368
jmp 0x18
pop esi
xor edx, edx
push edx
push esi
mov ecx, esp
mov ebx, esi
xor eax, eax
mov al, 0xb
int 0x80
xor ebx, ebx
xor eax, eax
inc eax
int 0x80
call 0x2
das
bound ebp, [ecx+0x6e]
das
jae 0x8c
Rabin2 — утилита для работы с различными исполняемыми файлами (ELF, PE, Java class, Mach-O). Используется для получения различной информации о файле: импортируемые функции, экспортируемые символы, секции, подключаемые библиотеки и прочее. Рассмотрим самые популярные действия.
Получаем информацию о формате и включенных системах защиты.
root@kali:~/# rabin2 -I 9f2520a3056543d49bb0f822d85ce5dd
file 9f2520a3056543d49bb0f822d85ce5dd
type DLL (Dynamic Link Library)
pic false
canary false
nx false
crypto false
has_va true
root pe
class PE32
lang unknown
arch x86
bits 32
machine i386
os windows
subsys Windows GUI
endian big
strip false
static false
linenum true
lsyms true
relocs true
rpath NONE
- Получаем список импортируемых функций и из каких библиотек они вызываются:
root@kali:~/# rabin2 -i 9f2520a3056543d49bb0f822d85ce5dd
...
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=WS2_32.DLL_WSAIoctl
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=SHFolder.dll_SHGetFolderPathA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=ntdll_NtUnmapViewOfSection
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=user32.dll_EnumDisplayMonitors
ordinal=002 plt=0x00000000 bind=NONE type=FUNC name=user32.dll_GetMonitorInfoA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=SHELL32.DLL_SHEmptyRecycleBinA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=AVICAP32.DLL_capGetDriverDescriptionA
600 imports
- Ищем строки и где они находятся. Кто-то скажет, что ему хватает утилиты strings, но данный вариант более умный и показывает дополнительную информацию, которая нужна при анализе:
root@kali:~/# rabin2 -z 9f2520a3056543d49bb0f822d85ce5dd
...
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=WS2_32.DLL_WSAIoctl
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=SHFolder.dll_SHGetFolderPathA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=ntdll_NtUnmapViewOfSection
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=user32.dll_EnumDisplayMonitors
ordinal=002 plt=0x00000000 bind=NONE type=FUNC name=user32.dll_GetMonitorInfoA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=SHELL32.DLL_SHEmptyRecycleBinA
ordinal=001 plt=0x00000000 bind=NONE type=FUNC name=AVICAP32.DLL_capGetDriverDescriptionA
600 imports
Можно указать эти параметры вместе и получить сразу нужную информацию в один поток. А в блоге проекта представлена статья, как вытаскивать исполняемые файлы из бинарного файла.
Rahash2 — утилита для получения хеш-значений во многих форматах как от бинарных файлов, так и от определенных частей данных. Пример получения хешей для одной из RAT-малвари представлен на скриншоте (рис. 4).
Radiff2 — утилита для сравнения бинарных файлов. Для более успешной работы советую доустановить программу xdot, если у тебя ее еще нет:
root@kali:~/# apt-get install xdot
Работает как через xdot, так и в консольном (ASCII) режиме. Пример ее работы я покажу в разделе по решению crackme.
Rafind2 — утилита для поиска как строк с помощью и без регулярных выражений, так и данных в шестнадцатеричном формате или по бинарному шаблону.
Ragg2 — экспериментальная утилита для компиляции небольших программ (шелл-кодов ;)) для x86/x64- и ARM-архитектур.
Rax2 — утилита для конвертации данных в различных форматах. Преобразуем hex-данные в строку:
root@kali:~/# rax2 -s 43 4a 50
CJP
Rarun2 (rr2) — позволяет запускать программу с различными параметрами среды, аргументами, правами и директориями. Это пригодится не только для решения различных crackme или CTF-задач, но и при фаззинге или тестах.
Теперь перейдем к самому radare2 и рассмотрим основные команды для работы с ним на примере небольшого crackme.
Разбираем crackme
В качестве примера я взял простой crackme от пользователя Lord из архива сайта crackmes.de, а работать будем в 32-битном Kali Linux. Запустим загруженный файл:
root@kali:~/crackmes# ./cm1eng
Password : dukebarman
root@kali:~/crackmes#
Значит, нам требуется найти правильный пароль. Причем неверный вариант никак не помечается, программа просто завершается. Ну что же, для начала рассмотрим сам файл:
root@kali:~/crackmes# rabin2 -I cm1eng
...
root elf
class ELF32
lang c
arch x86
bits 32
machine Intel 80386
os linux
subsys linux
endian little
strip true
...
Как видим, опция strip
присутствует. Несмотря на то что crackme записан для новичков, автор решил уж совсем задачу не облегчать и удалил «лишнюю» информацию из файла. Поэтому теперь загрузим программу в radare2 и увидим одну из встречающихся случайных фраз:
root@kali:~/crackmes# r2 ./cm1eng
-- Nothing to see here. Move along.
[0x08048080]>
После запуска нам нужно проанализировать файл с помощью команды, начинающейся с a
. Кстати, чтобы увидеть возможные команды, достаточно добавить знак вопроса к изменяющемуся символу, в нашем случае это будет a?
:
[0x08048080]> a?
|Usage: a
| a8 [hexpairs] analyze bytes
| aa analyze all (fcns + bbs)
...
Вернемся к анализу. В фреймворке возможно проанализировать как весь файл, так и отдельные блоки, строки и так далее. Проанализируем весь файл и, раз требуется ввести пароль, попробуем его найти — возможно, его оставили вшитым в программу. Все-таки этот crackme считается начального уровня:
[0x08048080]> aa
[0x08048080]> iz
addr=0x100910f8 off=0x000000f8 ordinal=000 sz=13 len=12 section=.data type=a string=\nPassword :
addr=0x10091105 off=0x00000105 ordinal=001 sz=33 len=32 section=.data type=a string=Great you did it !:)\n\n
addr=0x10091126 off=0x00000126 ordinal=002 sz=8 len=7 section=.data type=a string=QTBXCTU
[0x08048080]>
Ты уже знаком с командой iz, поэтому уточню небольшой нюанс о работе со строками в фреймворке. Все строки автоматически преобразуются в переменную со схожим именем:
Great you did it !:)\n\n -> str.Great_you_did_it_____n_n
К таким переменным можно обращаться: @str.Great_you_did_it_____n_n
. Также работает автодополнение через клавишу Tab
, что очень удобно при их большом количестве. Помимо этого, есть возможность поиска как строк, так и различных байтов через команду /
. Пример поиска строки:
[0x08048080]> / Password
Searching 8 bytes from 0x08048000 to 0x0804a0f8: 50 61 73 73 77 6f 72 64
hits: 2
0x080480f9 hit3_0 "Password"
0x080490f9 hit3_1 "Password"
[0x08048080]> px 10 @0x080480f9
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x080480f9 5061 7373 776f 7264 203a Password :
Но вернемся к нашей программе. Так как она небольшая, у нее нет импортируемых функций, но есть несколько строчек. Одну мы видим постоянно при запуске crackme, а вот остальные две представляют для нас большой интерес. Первая позволит найти место в коде, которое ведет к верному решению, а вторая, возможно, является паролем. Попробуем вторую строку:
root@kali:~/crackmes# ./cm1eng
Password : QTBXCTU
root@kali:~/crackmes#
Увы, но это не пароль, хотя, возможно, все-таки нам пригодится. А пока, раз у нас есть строка, которая теоретически выводится при удачном решении, попробуем решить crackme «нечестным» образом — пропатчим файл. Создадим копию файла (заодно она нам пригодится для обещанного примера) и загрузим ее в фреймворк, но через дополнительную команду, которая откроет файл в режиме записи:
root@kali:~/crackmes# r2 -w ./cm1eng_crack
-- Nothing to see here. Move along.
[0x08048080]> aa
[0x08048080]> pdf
Помимо команды проанализировать файл, добавилась новая — pd?
Она позволяет вывести на экран дизассемблированные строки. В нашем случае — всей функции, а так как файл небольшой, она и является главной. Вывод осуществляется до конца функции. Так как мы запускаем с десктопа, то и прокрутить вывод в терминале не составит труда, но можно вывести только первые N строчек с текущего адреса. Поэтому найдем строчку с позитивным сообщением в этой функции. Если же так не получается, то воспользуемся еще одной особенностью фреймворка.
Помимо различного встроенного функционала, в radare2 есть поддержка запуска системных утилит, в частности grep
:
[0x08048080]> pdf | grep str.Great
| | 0x080480e3 b905910408 mov ecx, str.Great_you_did_it_____n_n ; 0x08049105
Вот мы и получили сразу нужный адрес, в который передается наша строка. Так как проверка пароля должна быть до обращения к ней, то выведем строки до нее. Для начала возьмем десять:
[0x08048080]> pd -10 @0x080480e3
| 0x080480c2 02e2 add ah, dl
| 0x080480c4 f1 int1
| ; JMP XREF from 0x080480c1 (section..text)
| 0x080480c5 be1b910408 mov esi, 0x804911b ; 0x0804911b
| 0x080480ca bf26910408 mov edi, str.QTBXCTU ; 0x08049126
| 0x080480cf b907000000 mov ecx, 0x7 ; 0x00000007
| 0x080480d4 fc cld
| 0x080480d5 f3a6 repe cmpsb
| ,=< 0x080480d7 7516 jne 0x80480ef ; (section..text)
| | 0x080480d9 b804000000 mov eax, 0x4 ; 0x00000004
| | 0x080480de bb01000000 mov ebx, 0x1 ; 0x00000001
[0x08048080]>
Вот мы и нашли проверку и переход не к нужной нам функции по адресу 0x080480d7
. Более наглядно часть кода представлена на скриншоте, где я проскроллил до нужного нам места (рис. 5).
Описание операнда сравнения я приводил выше. Как видишь, какая-то строка (а какая, кроме введенной, в принципе, еще может быть?) сравнивается с найденной нами ранее, но оставим это пока что. Наша задача теперь — пропатчить эту команду перехода.
Перейдем к ней и проверим, правильный ли адрес указали:
[0x08048080]> s 0x080480d7
[0x080480d7]> pd 7
| ,=< 0x080480d7 7516 jne 0x80480ef ; (section..text)
| | 0x080480d9 b804000000 mov eax, 0x4 ; 0x00000004
| | 0x080480de bb01000000 mov ebx, 0x1 ; 0x00000001
| | 0x080480e3 b905910408 mov ecx, str.Great_you_did_it_____n_n ; 0x08049105
| | 0x080480e8 ba16000000 mov edx, 0x16 ; 0x00000016
| | 0x080480ed cd80 int 0x80
| | syscall[0x80][0]=? ; section_end..shstrtab+91
| | ; JMP XREF from 0x080480d7 (section..text)
| `-> 0x080480ef b801000000 mov eax, 0x1 ; 0x00000001
[0x080480d7]>
А вот запатчить можно разными способами. Примеры операндов в шестнадцатеричном представлении:
[0x080480d7]> !rasm2 -a x86 -d '7516'
jne 0x18
[0x080480d7]> !rasm2 -a x86 -d '7416'
je 0x18
[0x080480d7]> !rasm2 -a x86 -d 'eb00'
jmp 0x2
[0x080480d7]> !rasm2 -a x86 -d '9090'
no
nop
- Наша непосредственная команда.
- Старый добрый патчинг: видим n — удаляем, не видим — добавляем.
- Прыжок на «следующий» адрес.
- Ну и просто забить пропускающимися байтами.
Возьмем третий вариант и выйдем для проверки:
[0x080480d7]> wx eb00
[0x080480d7]> q
Результат ты можешь увидеть на скриншоте (рис. 6). Теперь любой введенный код будет считаться правильным :). А утилиту rasm2 в этом случае можно использовать для проверки правильности ввода. Командой w?
вида wx
ты патчишь в виде шестнадцатеричных чисел, но при желании можно вводить и обычными командами:
wa jmp 0x80480d9
С помощью «грязного» трюка мы решили этот crackme, но хотелось бы разобраться с настоящим паролем. Вспомним, что неизвестная строка все-таки проверяется перед выводом победного сообщения. При анализе находим небольшой цикл, который берет семь символов и XOR’ит их с ключом 0x21 (рис. 7).
Попробуем провести обратную операцию с найденной строкой. Найдем ее представление в коде:
[0x08048080]> px 16 @str.QTBXCTU
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x08049126 5154 4258 4354 5500 0054 6865 204e 6574 QTBXCTU..The Net
Мне было быстрее найденные hex-значения загрузить в 010-Editor и расшифровать, но radare2 поддерживает различные арифметические операции, и при желании можно сделать XOR для каждого символа:
[0x08048080]> ? 51h^21h
112 0x70 0160 112.0 0000:0070 112 "p" 01110000 112.0 0.000000
Или написать небольшой плагин :). Но в итоге все равно получаем строку pucybut. Это и есть наш пароль.
На будущее можно сразу искать необычные XOR-команды.
[0x08048080]> pdf | grep xor
| 0x080480b3 31db xor ebx, ebx
| | 0x080480b7 3421 xor al, 0x21
| |||| 0x08048149 2e3338 xor edi, [cs:eax]
[0x08048080]>
Такую выборку еще используют для нахождения различных call-команд. Но теперь покажу обещанный пример использования утилиты radiff2. У нас имеются два файла с одной отличной функцией. Я предпочитаю смотреть сразу на два файла, то есть на одном отличия первого, на другом — второго.
root@kali:~/crackmes# radiff2 -g main cm1eng_crack cm1eng > /tmp/cm1
root@kali:~/crackmes# radiff2 -g main cm1eng cm1eng_crack > /tmp/cm2
root@kali:~/crackmes# xdot /tmp/cm1 & xdot /tmp/cm2
Кстати, в таком формате можно и просто смотреть файл. Достаточно его сравнить с самим собой:
root@kali:~/crackmes# radiff2 -g main cm1eng cm1eng > /tmp/cm & xdot /tmp/cm
Раз мы коснулись визуализации, то рассмотрим существующие возможности.
Для сравнения я открыл этот же crackme на своем Android-устройстве.
Как видишь, вполне читабельно и удобно. Для этого примера я запустил фреймворк через консоль, но можно воспользоваться веб-интерфейсом, который работает и в мобильной версии. Так что теперь в поездках можешь попытаться порешать небольшие crackme или даже поучаствовать в различных CTF-мероприятиях со своего смартфона.
GUI
Единственная причина, на мой взгляд, почему radare2 до сих пор пробивается в массы не такими быстрыми шагами, — это потому, что отсутствует нормальный GUI-интерфейс. Во времена обилия как карманных, так и настольных устройств с touch-экранами это уже считается минимумом. На данный момент существует несколько встроенных утилит:
- визуальный интерфейс в консольном окне, который запускается командой VV (согласен, страшновато выглядит);
- у radare2 есть встроенный веб-интерфейс (в отличие от IDA и Hopper), который более-менее помогает в работе. Запускается следующей командой:
root@kali:~/crackmes# r2 -c=H cm1eng
Помимо встроенных интерфейсов, существует разработка от команды энтузиастов Inguma под названием Bokken. Это опенсорсный проект, с недавних пор поддерживает патчи как из GitHub, так и с Bitbucket. Написан с использованием PyGTK для работы с radare2 и pyew. С ним также работают ребята из CTF-команды Dragon Sector.
Outro
Увы, полностью описать работу с каждым модулем я не смогу, так как ограничен размером статьи. Но надеюсь, тех небольших знаний, которые ты получил из статьи, тебе хватит. Также советую просмотреть материалы по указанным ссылкам. Некоторые примеры тебя приятно удивят. В случае если возникнут проблемы с освоением, найдешь возможную ошибку в фреймворке или, может, захочешь помочь с программированием — милости просим на IRC-канал #radare в сети irc.freenode.net. Причем в отличие от ряда каналов, на которых я тоже присутствую, на этом ежедневно ведется обсуждение как проекта, так и других различных вещей.
Разработка фреймворка не стоит на месте, и версия 1.0 все ближе. Одно из планируемых нововведений, которое, как мне кажется, пригодится многим, — это поддержка 010-шаблонов для одноименного шестнадцатеричного редактора. А такие шаблоны особенно помогают при фаззинге.
Поэтому не удивляйся, если в момент чтения этого номера ты установишь версию 1.x.
Антон Кочков (xvilka), один из разработчиков этого фреймворка, представил его, как мне кажется, впервые на русском языке в виде небольшого доклада на PHDays 2014. В докладе он показал пример использования radare2 для анализа вредоносных программ. В качестве экземпляров были представлены Windows-троян Shylock и 64-битный Linux-вирус Snakso.A, для которых был проведен как статический анализ, так и отладка с использованием дебаггера. Видео доклада доступно на официальном сайте PHDays. А с презентацией ты можешь ознакомиться на slideshare-аккаунте мероприятия.
Создатели программы подали заявку в Summer of Code от Google, но получили отказ. Поэтому разработчики запустили краудфандинговую кампанию с целью провести свой Summer of Code — Radare Summer of Code 2014, о чем также написали на Хабрахабре.
Знаменитый хакер @pof, а по совместительству тот, кто создал Android Hacker Handbook и поддерживает Android-версию фреймворка, написал статью. В ней он объясняет разницу между взломом RAM-памяти и ROM-образа на примере игры Super Street Fighter II Turbo, используя для редактирования образа radare2.
Для улучшения читабельности дизассемблированного кода (в частности, сделать непрерывные стрелки, показывающие переходы) советую добавить опцию:
e scr.utf8=true
Такие небольшие команды можно прописать в файле конфигурации ./radarerc
, чтобы они выполнялись автоматически при запуске фреймворка.