1. Ловим шеллкоды под ARM
Докладчики :
Гайворонская Светлана @SadieSv
Петров Иван Сергеевич @_IvanPetrov_
2. Актуальность
• Значительный рост устройств на базе процессоров ARM:
количество устройств на базе ARM превышает
количество PC в несколько раз.
• Большая установочная база уязвимых программ и
преемственность кода
• Ошибки работы с памятью все еще актуальны
• Уязвимости в программном обеспечении этих устройств
могут принести огромный ущерб, как пользователям, так
и производителям
@SadieSv @_IvanPetrov_
3. Решаема ли эта задача?
Activator
• NOP
• GetPC
Decryptor
Payload
Return address zone
• Ограничения по структуре
• Ограничения по размеру
@SadieSv @_IvanPetrov_
4. Может все не так плохо?
• Stack canaries: вычисление псевдо-радномного
значения и сохранения его на стек;
• SafeSEH: вместо защиты стека, используются
техники защиты обработчиков исключений;
• DEP: стек или часть стека становятся
неисполнимыми;
• ASLR: рандомизация начала кода, стека, кучи в
адресном пространстве исполнимого
процесса.
BYPASSED
@SadieSv @_IvanPetrov_
5. Так что же с ARM-ом?
• Шеллкоды уже есть
• Методов обнаружения
«поумнее» сигнатур…
6. Анализ применимости
существующих методов
обнаружения шеллкодов
Для анализа применимости
существующих методов
детектирования шеллкодов х86
к платформе ARM нужно выделить
основные отличия этих архитектур.
@SadieSv @_IvanPetrov_
7. Основные отличия архитектур
ARM от x86:
• Фиксированный размер команд;
• Наличие 2-х режимов работы процессора (32bit и 16bit) и
возможность динамического переключения между ними;
• Возможность условного выполнения инструкций
(в зависимости от значения регистра флагов);
• Возможность прямого обращения к счетчику инструкций;
• load-store архитектура (мы не можем из арифметических
инструкций обращаться напрямую в память);
• При вызове функций аргументы помещаются в регистры.
@SadieSv @_IvanPetrov_
8. i f ( e r r != 0)
p r i n t f ( " Er r o r c o d e = %i n " , e r r ) ;
e l s e
p r i n t f ( "OK! n " ) ;
CMP r1 , #0
BEQ . L4
LDR r0 , < string_1_address >
BL printf
B . L8
. L4 :
LDR r0 , < string_2_address >
BL printf
. L8 :
CMP r1 , #0
LDRNE r0 , < string_1_address >
LDREQ r0 , < string_2_address >
BL printf
Без условного
выполнения
С условным
выполнением
Условное выполнение
@SadieSv @_IvanPetrov_
11. Причины затруднения анализа
Появление в платформе ARM новых
возможностей обфускации
программ благодаря:
1. Условному выполнению инструкций;
2. Дополнительному режиму
процессора.
@SadieSv @_IvanPetrov_
12. Статические признаки
• Корректное дизассемблирование данных в цепочку, содержащую
не менее K инструкций;
• Наличие команды смены режима процессора (BX Rm) на пересечении
цепочек команд из разных режимов процессора;
• Наличие Get-UsePC кода;
• Число паттернов ( инициализация аргументов, вызов функции )
превышает предопределенное пороговое значение;
• Системному вызову предшествует инициализация аргументов вызова;
• Наличие цикла записи/загрузки из памяти;
• Адрес возврата находится в определенном диапазоне значений;
• Последняя инструкция в цепочке заканчивается командой перехода
(BL, BLX), либо системным вызовом(svc);
• Операнды самомодифицирующегося кода и кода с косвенными
переходами должны быть инициализированы.
13. Корректное дизассемблирование данных в цепочку,
содержащую не менее K инструкций
Не шеллкод
Не шеллкод
Не шеллкод
Не шеллкод
Шеллкод!
@SadieSv @_IvanPetrov_
14. Наличие команды смены режима процессора (BX Rm) на
пересечении цепочек команд из разных режимов
процессора
Переключение режима
Шеллкод в режиме
Thumb
Данные для шеллкода
Регистр PCПереход с переключением Код режима
Thumb
@SadieSv @_IvanPetrov_
15. Наличие Get-UsePC кода
Регистр PC
Зашифрованный шеллкод
Получение PC
Использование PC
Получение PC в регистр LR (r14)
Использование PC
@SadieSv @_IvanPetrov_
16. Инициализация аргументов вызовов функций и
системных вызовов
Аргументы вызова
Номер вызова
Системный вызов
_socket #281
_connect #283
@SadieSv @_IvanPetrov_
17. Наличие цикла записи/загрузки из памяти
Зашифрованный шеллкод
Чтение из памяти
Загрузка в память
Счетчик цикла
Адрес зашифрованной
полезной нагрузки
Основной цикл
@SadieSv @_IvanPetrov_
18. Адрес возврата находится в определенном диапазоне
значений
Адрес
возврата
Уязвимый
буфер
Стек
Полезная
нагрузка
Шеллкод
0xbeffedbc
0xbeffedbc
0xbeffedbc
0xbeffedbc
0xbeffedbc
0xbeffedbc
Зона адресов
возврата
@SadieSv @_IvanPetrov_
19. Динамические признаки
• Количество чтений полезной нагрузки превышает
определенный порог;
• Количество уникальных записей в память
превышает определенный порог;
• Поток управления хотя бы один раз передается из
адресного пространства входного буфера на адрес,
по которому ранее осуществлялась запись;
• Количество исполненных wx-инструкций
превышает определенный порог;
• В зависимости от определенных значений флагов
выполняется набор инструкций, удовлетворяющих
вредоносной сигнатуре.
@SadieSv @_IvanPetrov_
20. Запись и чтение из памяти
Декриптор Зашифрованная полезная нагрузка
N Уникальных чтений и записей
@SadieSv @_IvanPetrov_
22. Зависимость сигнатуры от флагов
Z = 0 & C = 0 Z = 1 & C = 0
ADDNES r0, r1 ADDNES r0, r1
Блок AL
(любой флаг)
Блок AL
(любой флаг)
Блок CS
( С == 1)
Z = 0
С = 1
Блок CS
( С == 1)
Блок EQ
( Z == 0)
Блок EQ
( Z == 0)
ADDCCS r3, r4 ADDCCS r3, r4
Z = 1
С = 0
Если был
выполнен блок
EQ, то Z = 1,
иначе Z = 0
Блок EQ
( Z == 0)
Блок EQ
( Z == 0)
@SadieSv @_IvanPetrov_
26. Апробация
• Шеллкодов;
• Легитимных исполняемых файлов;
• Произвольных данных;
• Мультимедиа данных.
Апробация детекторов проводится на тестовой
выборке, состоящей из:
@SadieSv @_IvanPetrov_
27. Результат исследований
• Выделены признаки шеллкодов для
платформы ARM
• Реализованы детекторы, использующие
признаки шеллкодов ARM
• Детекторы объединены в гибридный
классификатор
• Классификатор реализован как расширение
к библиотеке Demorpheus
@SadieSv @_IvanPetrov_