SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Рассмотрение техник Reverse Engineering на примере анализа
вредоносного ПО
INTRODUCTION TO MALWARE REVERSE
ENGINEERING
О себе
• Администратор и сооснователь форума reverse4you.org
• Организатор конференции R0-Crew
• Реверс-инжинер/вирусный аналитик
• Участник CTF команды R0-Crew
• Хаксор
О чем речь
• Что такое «Reverse engineering»
• Примеры из практики исследований
Что такое reverse engineering?
Области применения
• Создание кряков/обход лицензирования софта
• Анализ вирусов
• Анализ шеллкода
• Поиск уязвимостей
• Анализ логики ПО
Базовые знания и навыки
• Assembler x86/x64/ARM
• Программирование (CC++Obj-C, PythonPerlBashBat, Java)
• ОС Internals(Windows, Mac OS X, Android, iOS, Linux)
• Желание и упорство
Ресурсы для изучения
• RU
• reverse4you.org
• exelab.ru
• wasm.ru
• EN
• opensecuritytraining.info
• kernelmode.info
• tuts4you.com
Типы анализа
• Динамический
• Статический
• PE-анализаторы
• PEiD
• DiE
• CFF Explorer
• Hex-редакторы
• WinHex
• Hex Workshop
• 010 Editor
• HiEW
• Декомпиляторы
• .net Reflector
• Viper
• Dex2Jar
• ApkTool
• Дизассемблеры
• IDA Pro(BinDiff, Hex Rays)
• Hopper
• radare2
• Прочее
• Dependency Walker
• YARA
• Strings
• Resource Hacker
Инструменты для статического
анализа
• Отладчики
• OllyDBG
• Immunity Debbuger
• WinDbg
• gdb
• Песочницы
• Cuckoo
• Anubis
• Системы виртуализации
• VMWare
• Virtual Box
• Bosch
• Мониторинг
• Process Monitor
• RegShot
• WireShark
• Tcpdump
• Process Hacker
• TCPView
• Другие
• Import REConstructor
• Python
Инструменты для динамического
анализа
Главный инструмент
Начнем…
Результаты на VirusTotal
Базовый статический анализ
Самомодификация
.text:004014F5 push esp ; lpflOldProtect = [ESP+10]
.text:004014F6 push 40h ; flNewProtect =
0x40(PAGE_EXECUTE_READWRITE)
.text:004014F8 push 4000h ; dwSize = 4000
.text:004014FD push ebp
.text:004014FE mov dword ptr [esp], offset Main ; lpAddress = 401000
.text:00401505 mov eax, dword_405034
.text:0040150A add eax, 400000h
.text:0040150F call dword ptr [eax] ; VirtualProtect
.text:00401511 call sub_4018A6
.text:00401516 nop
.text:00401517 nop
.text:00401518 nop
.text:00401519 nop
.text:0040151A call sub_4018CC
.text:00401511 call sub_4018A6
.text:00401516 adc edx, [ebx]
.text:00401518 adc edx, [ebx]
.text:0040151A call sub_4018CC
Зашифрованный код Оригинальный код
Примеры зашифрованных участков
кода
.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
Функция расшифровки и
зашифрованный участок кода
Пример функции расшифровки Пример шифрованного кода
.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 ; продолжаем цикл
Расшифровка большого блока данных
Расшифровщик на ida-python
def xor_decrypt_key_array(effective_address, keys, size):
counter = 0
key_counter = 0
while counter < size :
key_counter = counter % 20
PatchByte( effective_address + counter,
Byte( effective_address + counter ) ^ keys [ key_counter ] )
counter += 1
Расшифрованная область памяти
.text:0040154E call loc_401573
---------------------------------------------------------------------------
.text:00401553 aGetmodulefilen db 'GetModuleFileNameA',0
.text:00401566 aKernel32_dll_1 db 'Kernel32.dll',0
---------------------------------------------------------------------------
.text:00401573 loc_401573: ; CODE XREF: sub_40142E+120
.text:00401573 pop eax
.text:00401574 push eax
.text:00401575 add eax, 13h
.text:00401578 push eax
.text:00401579 call ds:GetModuleHandleA
.text:0040157F push eax
.text:00401580 call sub_40142E ;GetFunctionPtrByName
.text:00401585 mov [ebp-4], eax
.text:00401588 add esp, 8
.text:0040158B call loc_4015AD
---------------------------------------------------------------------------
.text:00401590 aGetcommandline db 'GetCommandLineA',0
.text:004015A0 aKernel32_dll_0 db 'Kernel32.dll',0
---------------------------------------------------------------------------
.text:004015AD loc_4015AD: ; CODE XREF: .text:0040158B
.text:004015AD pop eax
.text:004015AE push eax
.text:004015AF add eax, 10h
.text:004015B2 push eax
.text:004015B3 call ds:GetModuleHandleA
.text:004015B9 push eax
.text:004015BA call sub_40142E
;GetFunctionPtrByName
.text:004015BF mov [ebp-8], eax
.text:004015C2 add esp, 8
Получение указателя на функцию
Список полученных указателей на
функции
• GetModuleFileNameA
• GetCommandLineA
• NtUnmapViewOfSection
• CreateProcessA
• WriteProcessMemory
• GetThreadContext
• ReadProcessMemory
• SetThreadContext
• ResumeThread
• VirtualAllocEx
• VirtualAlloc
• VirtualFree
Создание копии процесса
.text:004011D6 push eax ; lpProcessInformation = *ptr = 0
.text:004011D7 call fill_stuct_with_zero
.text:004011DC add esp, 18h
.text:004011DF lea eax, [ebp+var_18]
.text:004011E2 push eax ; lpStartupInfo = *ptr = 0
.text:004011E3 lea eax, [ebp+var_84]
.text:004011E9 push eax ; lpCurrentDirectory = *ptr = 0
.text:004011EA push edi ; lpCurrentDirectory = 0
.text:004011EB push edi ; lpEnvironment = 0
.text:004011EC push 0Ch ; dwCreationFlags = CREATE_SUSPENDED | DETACHED_PROCESS
.text:004011EE push edi ; bInheritHandles = 0
.text:004011EF push edi ; lpThreadAttributes = 0
.text:004011F0 push edi ; lpProcessAttributes = 0
.text:004011F1 push [ebp+arg_4] ; lpCommandLine = commandline of current process
.text:004011F4 push [ebp+arg_0] ; lpApplicationName = Name of current process
.text:004011F7 call [ebp+var_38] ; CreateProcessA
.text:004012EE push [ebp+var_14]
.text:004012F1 call [ebp+var_2C]
ResumeThread
.text:004012F4
.text:004012F4 loc_4012F4:
.text:004012F4 xor edi, edi
.text:004012F6 loc_4012F6:
.text:004012F6 push 8000h
.text:004012FB push edi
.text:004012FC push ebx
.text:004012FD call [ebp+var_34]
VirtualFree
.text:0040378A mov [ebp+var_68], eax
.text:0040378D push eax ; Code
.text:0040378E call ds:exit
Завершение работы родительского
процесса
Продолжим…
Базовая информация о втором файле
• 0x405164 InternetSetOptionA
• 0x405168 HttpQueryInfoA
• 0x40516c InternetQueryDataAvailable
• 0x405170 InternetReadFile
• 0x405174 InternetCloseHandle
• 0x405178 InternetOpenA
• 0x40517c HttpSendRequestA
• 0x405180 HttpOpenRequestA
• 0x405184 InternetConnectA
• 0x40502c GetUserDefaultUILanguage
• 0x405030 VirtualProtect
• 0x405034 LoadLibraryA
• 0x405038 GetProcAddress
• 0x40503c VirtualAlloc
• 0x405040 VirtualFree
• 0x405048 GetCurrentProcess
• 0x405068 FindFirstFileA
• 0x40507c WriteFile
• 0x405080 GetFileSize
• 0x405084 GetFileTime
Список импортируемых функций
KERNEL32.dll WININET.dll
• 0x405000 RegCloseKey
• 0x405004 RegOpenKeyExA
• 0x405008 SetSecurityDescriptorDacl
• 0x40500c InitializeSecurityDescriptor
• 0x405010 RegDeleteValueA
• 0x405014 GetSidSubAuthority
• 0x405018 GetSidSubAuthorityCount
• 0x40501c GetTokenInformation
• 0x405020 OpenProcessToken
• 0x405024 RegQueryValueExA
• 0x4050a4 GetModuleHandleA
• 0x4050a8 MultiByteToWideChar
• 0x4050ac WideCharToMultiByte
• 0x4050b0 CloseHandle
• 0x4050b4 SetFilePointer
• 0x4050b8 ReadFile
• 0x4050bc GetLastError
• 0x4050c0 lstrcpynA
Список импортируемых функций
KERNEL32.dll ADVAPI32.dll
Первый интересный участок кода
.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)
Создание файла и запись в него
.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
Создание файла и запись в него
.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
Создание файла и запись в него
.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
.text:00403828 push 0 ; hTemplateFile = NULL
.text:0040382A push 80h ; dwFlagsAndAttributes =
NORMAL
.text:0040382F push 2 ; dwCreationDisposition =
CREATE_ALWAYS
.text:00403831 push 0 ; lpSecurityAttributes = NULL
.text:00403833 push 0 ; dwShareMode = 0
.text:00403835 push 40000000h ; dwDesiredAccess =
GENERIC_WRITE
.text:0040383A push eax ; lpFileName
.text:0040383B call ds:CreateFileA
.text:00403856 push edi
.text:00403857 push 0 ; lpOverlapped
.text:00403859 lea ecx, [ebp+NumberOfBytesWritten]
.text:0040385C push ecx ;
lpNumberOfBytesWritten
.text:0040385D push ebx ;
nNumberOfBytesToWrite
.text:0040385E push edx ; lpBuffer
.text:0040385F push esi ; hFile
.text:00403860 mov [ebp+NumberOfBytesWritten], 0
.text:00403867 call ds:WriteFile
Внутри функции записи в файл
Расшифровка IP-адреса CC
.text:00401522 loc_401522:
.text:00401522 xor byte ptr CryptedIP [ebx], 65h ; "TRSKPVKTWPKWUe"
.text:00401529 jnz short loc_401582
...
.text:00401582 loc_401582:
.text:00401582 inc ebx
.text:00401583 cmp ebx, 0Eh
.text:00401586 jb short loc_401522
Зашифрованный адрес: TRSKPVKTWPKWUe
Расшифрованный адрес: 176.53.25.20
Общение с сервером
Адрес сервера: 176.53.25.20
Запрос: get_two?v=14&a=235&u=44003839a2664e19a46427f1fca8f005&f=0&i=0
Ответ сервера
Итог:
Вступай и реверси
Вопросы
Контактная информация
Social:
• twitter.com/ximerus
• fb.com/ximerus
• linkedin.com/ximerus
Site:
• ximerus.org
• reverse4you.org
Спасибо за внимание

Weitere ähnliche Inhalte

Was ist angesagt?

Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Подводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IПодводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IVladimir Kochetkov
 
Valgrind
ValgrindValgrind
Valgrindium13
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
Автоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовАвтоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовd_olex
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7Technopark
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыd_olex
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8DefconRussia
 
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 

Was ist angesagt? (19)

Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Подводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IПодводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, I
 
How to debug
How to debugHow to debug
How to debug
 
Valgrind
ValgrindValgrind
Valgrind
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Автоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовАвтоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстов
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективы
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
 
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
 

Andere mochten auch

Rock in rio
Rock in rioRock in rio
Rock in rioKaryn XP
 
PresentacióN Plan B
PresentacióN Plan BPresentacióN Plan B
PresentacióN Plan Binmamart
 
List Film 7 Oghab
List Film 7 OghabList Film 7 Oghab
List Film 7 Oghabgueste7d2d2
 
Marketing presentation_FINAL
Marketing presentation_FINALMarketing presentation_FINAL
Marketing presentation_FINALGayeon Bae
 
Team pizzasola sectionB_part2
Team pizzasola sectionB_part2Team pizzasola sectionB_part2
Team pizzasola sectionB_part2Gayeon Bae
 
Hotpin datasheet
Hotpin datasheetHotpin datasheet
Hotpin datasheetHai Nguyen
 
List Film Film Mashhad
List Film Film MashhadList Film Film Mashhad
List Film Film Mashhadgueste7d2d2
 
Latest project background 1
Latest project background 1Latest project background 1
Latest project background 1JamesMoy7
 
Железо и здоровье человека
Железо и здоровье человекаЖелезо и здоровье человека
Железо и здоровье человекаLjudmilla Nikolajenko
 
Estante Virtual: operação e gestão de um marketplace
Estante Virtual: operação e gestão de um marketplaceEstante Virtual: operação e gestão de um marketplace
Estante Virtual: operação e gestão de um marketplaceE-Commerce Brasil
 
La paradoja Autora: Stephany Catro
La paradoja Autora: Stephany Catro La paradoja Autora: Stephany Catro
La paradoja Autora: Stephany Catro ANY2101
 
всё о витаминах
всё о витаминахвсё о витаминах
всё о витаминахguest3ecdecf
 
I ja j-i õigekiri
I ja j-i õigekiriI ja j-i õigekiri
I ja j-i õigekiririinaoun
 

Andere mochten auch (20)

Rock in rio
Rock in rioRock in rio
Rock in rio
 
Kk konspektas
Kk konspektasKk konspektas
Kk konspektas
 
PresentacióN Plan B
PresentacióN Plan BPresentacióN Plan B
PresentacióN Plan B
 
Themost
ThemostThemost
Themost
 
Themost
ThemostThemost
Themost
 
List Film 7 Oghab
List Film 7 OghabList Film 7 Oghab
List Film 7 Oghab
 
Marketing presentation_FINAL
Marketing presentation_FINALMarketing presentation_FINAL
Marketing presentation_FINAL
 
Team pizzasola sectionB_part2
Team pizzasola sectionB_part2Team pizzasola sectionB_part2
Team pizzasola sectionB_part2
 
Hotpin datasheet
Hotpin datasheetHotpin datasheet
Hotpin datasheet
 
List Film Film Mashhad
List Film Film MashhadList Film Film Mashhad
List Film Film Mashhad
 
Reglamento
ReglamentoReglamento
Reglamento
 
Latest project background 1
Latest project background 1Latest project background 1
Latest project background 1
 
Железо и здоровье человека
Железо и здоровье человекаЖелезо и здоровье человека
Железо и здоровье человека
 
Estante Virtual: operação e gestão de um marketplace
Estante Virtual: operação e gestão de um marketplaceEstante Virtual: operação e gestão de um marketplace
Estante Virtual: operação e gestão de um marketplace
 
Kontrak belajar
Kontrak belajarKontrak belajar
Kontrak belajar
 
La paradoja Autora: Stephany Catro
La paradoja Autora: Stephany Catro La paradoja Autora: Stephany Catro
La paradoja Autora: Stephany Catro
 
Why mobile?
Why mobile?Why mobile?
Why mobile?
 
El-futhark-antiguo
El-futhark-antiguoEl-futhark-antiguo
El-futhark-antiguo
 
всё о витаминах
всё о витаминахвсё о витаминах
всё о витаминах
 
I ja j-i õigekiri
I ja j-i õigekiriI ja j-i õigekiri
I ja j-i õigekiri
 

Ähnlich wie «Introduction to malware reverse engineering» by Sergey Kharyuk

Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Ontico
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах solertia
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Ontico
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 

Ähnlich wie «Introduction to malware reverse engineering» by Sergey Kharyuk (20)

Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах Практика эксплуатации уязвимостей в прикладных программах
Практика эксплуатации уязвимостей в прикладных программах
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 

«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
  • 9. • PE-анализаторы • PEiD • DiE • CFF Explorer • Hex-редакторы • WinHex • Hex Workshop • 010 Editor • HiEW • Декомпиляторы • .net Reflector • Viper • Dex2Jar • ApkTool • Дизассемблеры • IDA Pro(BinDiff, Hex Rays) • Hopper • radare2 • Прочее • Dependency Walker • YARA • Strings • Resource Hacker Инструменты для статического анализа
  • 10. • Отладчики • OllyDBG • Immunity Debbuger • WinDbg • gdb • Песочницы • Cuckoo • Anubis • Системы виртуализации • VMWare • Virtual Box • Bosch • Мониторинг • Process Monitor • RegShot • WireShark • Tcpdump • Process Hacker • TCPView • Другие • Import REConstructor • Python Инструменты для динамического анализа
  • 15. Самомодификация .text:004014F5 push esp ; lpflOldProtect = [ESP+10] .text:004014F6 push 40h ; flNewProtect = 0x40(PAGE_EXECUTE_READWRITE) .text:004014F8 push 4000h ; dwSize = 4000 .text:004014FD push ebp .text:004014FE mov dword ptr [esp], offset Main ; lpAddress = 401000 .text:00401505 mov eax, dword_405034 .text:0040150A add eax, 400000h .text:0040150F call dword ptr [eax] ; VirtualProtect
  • 16. .text:00401511 call sub_4018A6 .text:00401516 nop .text:00401517 nop .text:00401518 nop .text:00401519 nop .text:0040151A call sub_4018CC .text:00401511 call sub_4018A6 .text:00401516 adc edx, [ebx] .text:00401518 adc edx, [ebx] .text:0040151A call sub_4018CC Зашифрованный код Оригинальный код Примеры зашифрованных участков кода
  • 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 ; продолжаем цикл Расшифровка большого блока данных
  • 19. Расшифровщик на ida-python def xor_decrypt_key_array(effective_address, keys, size): counter = 0 key_counter = 0 while counter < size : key_counter = counter % 20 PatchByte( effective_address + counter, Byte( effective_address + counter ) ^ keys [ key_counter ] ) counter += 1
  • 21. .text:0040154E call loc_401573 --------------------------------------------------------------------------- .text:00401553 aGetmodulefilen db 'GetModuleFileNameA',0 .text:00401566 aKernel32_dll_1 db 'Kernel32.dll',0 --------------------------------------------------------------------------- .text:00401573 loc_401573: ; CODE XREF: sub_40142E+120 .text:00401573 pop eax .text:00401574 push eax .text:00401575 add eax, 13h .text:00401578 push eax .text:00401579 call ds:GetModuleHandleA .text:0040157F push eax .text:00401580 call sub_40142E ;GetFunctionPtrByName .text:00401585 mov [ebp-4], eax .text:00401588 add esp, 8 .text:0040158B call loc_4015AD --------------------------------------------------------------------------- .text:00401590 aGetcommandline db 'GetCommandLineA',0 .text:004015A0 aKernel32_dll_0 db 'Kernel32.dll',0 --------------------------------------------------------------------------- .text:004015AD loc_4015AD: ; CODE XREF: .text:0040158B .text:004015AD pop eax .text:004015AE push eax .text:004015AF add eax, 10h .text:004015B2 push eax .text:004015B3 call ds:GetModuleHandleA .text:004015B9 push eax .text:004015BA call sub_40142E ;GetFunctionPtrByName .text:004015BF mov [ebp-8], eax .text:004015C2 add esp, 8 Получение указателя на функцию
  • 22. Список полученных указателей на функции • GetModuleFileNameA • GetCommandLineA • NtUnmapViewOfSection • CreateProcessA • WriteProcessMemory • GetThreadContext • ReadProcessMemory • SetThreadContext • ResumeThread • VirtualAllocEx • VirtualAlloc • VirtualFree
  • 23. Создание копии процесса .text:004011D6 push eax ; lpProcessInformation = *ptr = 0 .text:004011D7 call fill_stuct_with_zero .text:004011DC add esp, 18h .text:004011DF lea eax, [ebp+var_18] .text:004011E2 push eax ; lpStartupInfo = *ptr = 0 .text:004011E3 lea eax, [ebp+var_84] .text:004011E9 push eax ; lpCurrentDirectory = *ptr = 0 .text:004011EA push edi ; lpCurrentDirectory = 0 .text:004011EB push edi ; lpEnvironment = 0 .text:004011EC push 0Ch ; dwCreationFlags = CREATE_SUSPENDED | DETACHED_PROCESS .text:004011EE push edi ; bInheritHandles = 0 .text:004011EF push edi ; lpThreadAttributes = 0 .text:004011F0 push edi ; lpProcessAttributes = 0 .text:004011F1 push [ebp+arg_4] ; lpCommandLine = commandline of current process .text:004011F4 push [ebp+arg_0] ; lpApplicationName = Name of current process .text:004011F7 call [ebp+var_38] ; CreateProcessA
  • 24. .text:004012EE push [ebp+var_14] .text:004012F1 call [ebp+var_2C] ResumeThread .text:004012F4 .text:004012F4 loc_4012F4: .text:004012F4 xor edi, edi .text:004012F6 loc_4012F6: .text:004012F6 push 8000h .text:004012FB push edi .text:004012FC push ebx .text:004012FD call [ebp+var_34] VirtualFree .text:0040378A mov [ebp+var_68], eax .text:0040378D push eax ; Code .text:0040378E call ds:exit Завершение работы родительского процесса
  • 26. Базовая информация о втором файле
  • 27. • 0x405164 InternetSetOptionA • 0x405168 HttpQueryInfoA • 0x40516c InternetQueryDataAvailable • 0x405170 InternetReadFile • 0x405174 InternetCloseHandle • 0x405178 InternetOpenA • 0x40517c HttpSendRequestA • 0x405180 HttpOpenRequestA • 0x405184 InternetConnectA • 0x40502c GetUserDefaultUILanguage • 0x405030 VirtualProtect • 0x405034 LoadLibraryA • 0x405038 GetProcAddress • 0x40503c VirtualAlloc • 0x405040 VirtualFree • 0x405048 GetCurrentProcess • 0x405068 FindFirstFileA • 0x40507c WriteFile • 0x405080 GetFileSize • 0x405084 GetFileTime Список импортируемых функций KERNEL32.dll WININET.dll
  • 28. • 0x405000 RegCloseKey • 0x405004 RegOpenKeyExA • 0x405008 SetSecurityDescriptorDacl • 0x40500c InitializeSecurityDescriptor • 0x405010 RegDeleteValueA • 0x405014 GetSidSubAuthority • 0x405018 GetSidSubAuthorityCount • 0x40501c GetTokenInformation • 0x405020 OpenProcessToken • 0x405024 RegQueryValueExA • 0x4050a4 GetModuleHandleA • 0x4050a8 MultiByteToWideChar • 0x4050ac WideCharToMultiByte • 0x4050b0 CloseHandle • 0x4050b4 SetFilePointer • 0x4050b8 ReadFile • 0x4050bc GetLastError • 0x4050c0 lstrcpynA Список импортируемых функций KERNEL32.dll ADVAPI32.dll
  • 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
  • 33. .text:00403828 push 0 ; hTemplateFile = NULL .text:0040382A push 80h ; dwFlagsAndAttributes = NORMAL .text:0040382F push 2 ; dwCreationDisposition = CREATE_ALWAYS .text:00403831 push 0 ; lpSecurityAttributes = NULL .text:00403833 push 0 ; dwShareMode = 0 .text:00403835 push 40000000h ; dwDesiredAccess = GENERIC_WRITE .text:0040383A push eax ; lpFileName .text:0040383B call ds:CreateFileA .text:00403856 push edi .text:00403857 push 0 ; lpOverlapped .text:00403859 lea ecx, [ebp+NumberOfBytesWritten] .text:0040385C push ecx ; lpNumberOfBytesWritten .text:0040385D push ebx ; nNumberOfBytesToWrite .text:0040385E push edx ; lpBuffer .text:0040385F push esi ; hFile .text:00403860 mov [ebp+NumberOfBytesWritten], 0 .text:00403867 call ds:WriteFile Внутри функции записи в файл
  • 34. Расшифровка IP-адреса CC .text:00401522 loc_401522: .text:00401522 xor byte ptr CryptedIP [ebx], 65h ; "TRSKPVKTWPKWUe" .text:00401529 jnz short loc_401582 ... .text:00401582 loc_401582: .text:00401582 inc ebx .text:00401583 cmp ebx, 0Eh .text:00401586 jb short loc_401522 Зашифрованный адрес: TRSKPVKTWPKWUe Расшифрованный адрес: 176.53.25.20
  • 35. Общение с сервером Адрес сервера: 176.53.25.20 Запрос: get_two?v=14&a=235&u=44003839a2664e19a46427f1fca8f005&f=0&i=0
  • 39. Контактная информация Social: • twitter.com/ximerus • fb.com/ximerus • linkedin.com/ximerus Site: • ximerus.org • reverse4you.org