Ловим шеллкоды под ARM

495 views
389 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
495
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Ловим шеллкоды под ARM

  1. 1. Ловим шеллкоды под ARM Докладчики : Гайворонская Светлана @SadieSv Петров Иван Сергеевич @_IvanPetrov_
  2. 2. Актуальность • Значительный рост устройств на базе процессоров ARM: количество устройств на базе ARM превышает количество PC в несколько раз. • Большая установочная база уязвимых программ и преемственность кода • Ошибки работы с памятью все еще актуальны • Уязвимости в программном обеспечении этих устройств могут принести огромный ущерб, как пользователям, так и производителям @SadieSv @_IvanPetrov_
  3. 3. Решаема ли эта задача? Activator • NOP • GetPC Decryptor Payload Return address zone • Ограничения по структуре • Ограничения по размеру @SadieSv @_IvanPetrov_
  4. 4. Может все не так плохо? • Stack canaries: вычисление псевдо-радномного значения и сохранения его на стек; • SafeSEH: вместо защиты стека, используются техники защиты обработчиков исключений; • DEP: стек или часть стека становятся неисполнимыми; • ASLR: рандомизация начала кода, стека, кучи в адресном пространстве исполнимого процесса. BYPASSED @SadieSv @_IvanPetrov_
  5. 5. Так что же с ARM-ом? • Шеллкоды уже есть • Методов обнаружения «поумнее» сигнатур…
  6. 6. Анализ применимости существующих методов обнаружения шеллкодов Для анализа применимости существующих методов детектирования шеллкодов х86 к платформе ARM нужно выделить основные отличия этих архитектур. @SadieSv @_IvanPetrov_
  7. 7. Основные отличия архитектур ARM от x86: • Фиксированный размер команд; • Наличие 2-х режимов работы процессора (32bit и 16bit) и возможность динамического переключения между ними; • Возможность условного выполнения инструкций (в зависимости от значения регистра флагов); • Возможность прямого обращения к счетчику инструкций; • load-store архитектура (мы не можем из арифметических инструкций обращаться напрямую в память); • При вызове функций аргументы помещаются в регистры. @SadieSv @_IvanPetrov_
  8. 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_
  9. 9. Thumb режим процессора chmod("/etc/passwd", 0777) - 31 byte "x78x46" // mov r0, pc "x10x30" // adds r0, #16 "xffx21" // movs r1, #255 ; 0xff "xffx31" // adds r1, #255 ; 0xff "x01x31" // adds r1, #1 "x0fx37" // adds r7, #15 "x01xdf" // svc 1 ; chmod(..) "x40x40" // eors r0, r0 "x01x27" // movs r7, #1 "x01xdf" // svc 1 ; exit(0) "x2fx65x74x63" "x2fx70x61x73" "x73x77" "x64” chmod("/etc/passwd", 0777) - 51 byte "x0fx00xa0xe1" // mov r0, pc "x20x00x90xe2" // adds r0, r0, #32 "xffx10xb0xe3" // movs r1, #255 ; 0xff "xffx10x91xe2" // adds r1, r1, #255; 0xff "x01x10x91xe2" // adds r1, r1, #1 "x0fx70x97xe2" // adds r7, r7, #15 "x01x00x00xef" // svc 1 "x00x00x30xe0" // eors r0, r0, r0 "x01x70xb0xe3" // movs r7, #1 "x01x00x00xef" // svc 1 "x2fx65x74x63" "x2fx70x61x73" "x73x77" "x64" Thumb режим ARM режим @SadieSv @_IvanPetrov_
  10. 10. Результаты анализа Статический анализ Динамический анализ @SadieSv @_IvanPetrov_
  11. 11. Причины затруднения анализа Появление в платформе ARM новых возможностей обфускации программ благодаря: 1. Условному выполнению инструкций; 2. Дополнительному режиму процессора. @SadieSv @_IvanPetrov_
  12. 12. Статические признаки • Корректное дизассемблирование данных в цепочку, содержащую не менее K инструкций; • Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов процессора; • Наличие Get-UsePC кода; • Число паттернов ( инициализация аргументов, вызов функции ) превышает предопределенное пороговое значение; • Системному вызову предшествует инициализация аргументов вызова; • Наличие цикла записи/загрузки из памяти; • Адрес возврата находится в определенном диапазоне значений; • Последняя инструкция в цепочке заканчивается командой перехода (BL, BLX), либо системным вызовом(svc); • Операнды самомодифицирующегося кода и кода с косвенными переходами должны быть инициализированы.
  13. 13. Корректное дизассемблирование данных в цепочку, содержащую не менее K инструкций Не шеллкод Не шеллкод Не шеллкод Не шеллкод Шеллкод! @SadieSv @_IvanPetrov_
  14. 14. Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов процессора Переключение режима Шеллкод в режиме Thumb Данные для шеллкода Регистр PCПереход с переключением Код режима Thumb @SadieSv @_IvanPetrov_
  15. 15. Наличие Get-UsePC кода Регистр PC Зашифрованный шеллкод Получение PC Использование PC Получение PC в регистр LR (r14) Использование PC @SadieSv @_IvanPetrov_
  16. 16. Инициализация аргументов вызовов функций и системных вызовов Аргументы вызова Номер вызова Системный вызов _socket #281 _connect #283 @SadieSv @_IvanPetrov_
  17. 17. Наличие цикла записи/загрузки из памяти Зашифрованный шеллкод Чтение из памяти Загрузка в память Счетчик цикла Адрес зашифрованной полезной нагрузки Основной цикл @SadieSv @_IvanPetrov_
  18. 18. Адрес возврата находится в определенном диапазоне значений Адрес возврата Уязвимый буфер Стек Полезная нагрузка Шеллкод 0xbeffedbc 0xbeffedbc 0xbeffedbc 0xbeffedbc 0xbeffedbc 0xbeffedbc Зона адресов возврата @SadieSv @_IvanPetrov_
  19. 19. Динамические признаки • Количество чтений полезной нагрузки превышает определенный порог; • Количество уникальных записей в память превышает определенный порог; • Поток управления хотя бы один раз передается из адресного пространства входного буфера на адрес, по которому ранее осуществлялась запись; • Количество исполненных wx-инструкций превышает определенный порог; • В зависимости от определенных значений флагов выполняется набор инструкций, удовлетворяющих вредоносной сигнатуре. @SadieSv @_IvanPetrov_
  20. 20. Запись и чтение из памяти Декриптор Зашифрованная полезная нагрузка N Уникальных чтений и записей @SadieSv @_IvanPetrov_
  21. 21. Передача потока управления Декриптор Расшифрованная полезная нагрузка Поток управления @SadieSv @_IvanPetrov_
  22. 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_
  23. 23. Предложенное решение Реализовывать детекторы выделенных признаков, как расширение к существующей библиотеке детектирования шеллкодов - Demorpheus @SadieSv @_IvanPetrov_
  24. 24. Demorpheus - идея @SadieSv @_IvanPetrov_
  25. 25. Гибридный классификатор Дизассемблирование Построение CFG Построение IFG … Дизассемблиро ванный поток CFG IFG … Детектор признака 1 Детектор признака К … @SadieSv @_IvanPetrov_
  26. 26. Апробация • Шеллкодов; • Легитимных исполняемых файлов; • Произвольных данных; • Мультимедиа данных. Апробация детекторов проводится на тестовой выборке, состоящей из: @SadieSv @_IvanPetrov_
  27. 27. Результат исследований • Выделены признаки шеллкодов для платформы ARM • Реализованы детекторы, использующие признаки шеллкодов ARM • Детекторы объединены в гибридный классификатор • Классификатор реализован как расширение к библиотеке Demorpheus @SadieSv @_IvanPetrov_
  28. 28. Результат исследований @SadieSv @_IvanPetrov_
  29. 29. Результат исследований @SadieSv @_IvanPetrov_
  30. 30. • Вопросы? Спасибо за внимание! @SadieSv @_IvanPetrov_

×