«Introduction to malware reverse engineering» by Sergey Kharyuk
1. Рассмотрение техник Reverse Engineering на примере анализа
вредоносного ПО
INTRODUCTION TO MALWARE REVERSE
ENGINEERING
2. О себе
• Администратор и сооснователь форума reverse4you.org
• Организатор конференции R0-Crew
• Реверс-инжинер/вирусный аналитик
• Участник CTF команды R0-Crew
• Хаксор
3. О чем речь
• Что такое «Reverse engineering»
• Примеры из практики исследований
5. Области применения
• Создание кряков/обход лицензирования софта
• Анализ вирусов
• Анализ шеллкода
• Поиск уязвимостей
• Анализ логики ПО
6. Базовые знания и навыки
• Assembler x86/x64/ARM
• Программирование (CC++Obj-C, PythonPerlBashBat, Java)
• ОС Internals(Windows, Mac OS X, Android, iOS, Linux)
• Желание и упорство
7. Ресурсы для изучения
• RU
• reverse4you.org
• exelab.ru
• wasm.ru
• EN
• opensecuritytraining.info
• kernelmode.info
• tuts4you.com
17. .text:00401524 sbb eax, 0C1B0061Dh
.text:00401529 fxch4 st(5)
.text:0040152B lea eax, [esi]
.text:0040152D mov eax, 8DCDDDDDh
.text:00401532 mov esi, 0F3720844h
.text:00401537 wait
.text:00401538 push es
.text:00401539 dec esp
.text:0040153A out 99h, eax
.text:0040153C adc al, 0D6h
.text:0040153E jp short loc_4015B6
.text:00401540 pop es
.text:004018AD mov ecx, 4
.text:004018B2 mov edx, 0FFFFFF83h
.text:004018B7 mov edi, [esp+10h]
.text:004018BB
.text:004018BB loc_4018BB:
.text:004018BB test ecx, ecx
.text:004018BD jz short loc_4018C5
.text:004018BF xor [edi], dl
.text:004018C1 dec ecx
.text:004018C2 inc edi
.text:004018C3 jmp short loc_4018BB
Функция расшифровки и
зашифрованный участок кода
Пример функции расшифровки Пример шифрованного кода
18. .text:00401526 mov edi, dword_40504C ; помещаем в EDI размер расшифровываемого блока
.text:0040152C mov esi, off_405050 ; помещаем в ESI адрес начала блока расшифроки
.text:00401532 xor ecx, ecx ; обнуляем счетки
.text:00401534 test edi, edi ; если EDI == 0
.text:00401536 jle short loc_40154E ; выходим из цикла
.text:00401538
.text:00401538 loc_401538: ; CODE XREF: .text:0040154Cj
.text:00401538 mov eax, ecx ; помещаем в eax значение счетчика
.text:0040153A push 14h ; помещаем в стек значение 20
.text:0040153C cdq ; заполняем EDX значение старшего байта регистра EAX
.text:0040153D pop ebx ; извлекаем из стека значение 20 в EBX
.text:0040153E idiv ebx ; помещаем в EDX результат EBX%EAX
.text:00401540 mov al, [edx+405038h] ; извлекаем в AL ключ расшифровки
.text:00401546 xor [ecx+esi], al ; расшифровываем байт
.text:00401549 inc ecx ; увеличиваем счетчик
.text:0040154A cmp ecx, edi ; если счетчик меньше размера блока
.text:0040154C jl short loc_401538 ; продолжаем цикл
Расшифровка большого блока данных
29. Первый интересный участок кода
.text:00401FC9 xor edi, edi
.text:00401FCB push 8003h
.text:00401FD0 mov [ebp+var_8], edi
.text:00401FD3 call ds:SetErrorMode
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
SEM_NOOPENFILEERRORBOX)
30. Создание файла и запись в него
.text:0040133E push eax ; nNumberOfBytesToWrite = 20
.text:0040133F push edx ; lpBuffer =
44003839a2664e19a46427f1fca8f005
.text:00401340 push ecx ; lpFileName =
C:UsersximeraAppDataLocalLowuygqvpmhse.png
.text:00401341 call sub_403820
31. Создание файла и запись в него
.text:0040133E push eax ; nNumberOfBytesToWrite = 20
.text:0040133F push edx ; lpBuffer =
44003839a2664e19a46427f1fca8f005
.text:00401340 push ecx ; lpFileName =
C:UsersximeraAppDataLocalLowuygqvpmhse.png
.text:00401341 call sub_403820
32. Создание файла и запись в него
.text:0040133E push eax ; nNumberOfBytesToWrite = 20
.text:0040133F push edx ; lpBuffer =
44003839a2664e19a46427f1fca8f005
.text:00401340 push ecx ; lpFileName =
C:UsersximeraAppDataLocalLowuygqvpmhse.png
.text:00401341 call sub_403820