SlideShare a Scribd company logo
1 of 88
Download to read offline
Kernel Pool Overflow:
от Windows XP до Windows 8
      Никита Тараканов
      CISS Research Team
Kernel Pool
• Используется для работы с динамической
  памятью в пространстве ядра
• Память доступна всем компонентам,
  работающим в пространстве ядра
• Различные типы памяти
• Каждый Pool описан структурой
  nt!_POOL_DESCRIPTOR
Типы памяти

• Определены в nt!_POOL_TYPE

• Много разновидностей – с каждым новым
 выпуском Windows кол-во увеличивается

• Три основных типа: Non-Paged, Paged,
 Session
nt!_POOL_TYPE(7 SP1)
•   typedef enum _POOL_TYPE{
•     NonPagedPool              = 0 /*0x0*/,
•     PagedPool              = 1 /*0x1*/,
•     NonPagedPoolMustSucceed           = 2 /*0x2*/,
•     DontUseThisType            = 3 /*0x3*/,
•     NonPagedPoolCacheAligned          = 4 /*0x4*/,
•     PagedPoolCacheAligned          = 5 /*0x5*/,
•     NonPagedPoolCacheAlignedMustS         = 6 /*0x6*/,
•     MaxPoolType              = 7 /*0x7*/,
•     NonPagedPoolSession           = 32 /*0x20*/,
•     PagedPoolSession           = 33 /*0x21*/,
•     NonPagedPoolMustSucceedSession        = 34 /*0x22*/,
•     DontUseThisTypeSession         = 35 /*0x23*/,
•     NonPagedPoolCacheAlignedSession = 36 /*0x24*/,
•     PagedPoolCacheAlignedSession       = 37 /*0x25*/,
•     NonPagedPoolCacheAlignedMustSSession = 38 /*0x26*/
nt!_POOL_TYPE(8 Dev. Prev.)

• Новые типы Pool’a – Not Executable:

1. NonPagedPoolNx = 512 /*0x200*/

2. NonPagedPoolNxCacheAligned = 516 /*0x204*/

3. NonPagedPoolSessionNx = 544 /*0x220*/
Non-Paged Pool
• Невыгружаемая системная память
• Доступна на любом уровне IRQ
• Количество Non-Paged Pool определено в
  nt!ExpNumberOfNonPagedPool и зависит от
  количества нодов nt!KeNumberNodes
• Создаётся в nt!InitializePool
• Указатель хранится в nt!PoolVector[0]
• Указатель хранится в массиве
  nt!ExpNonPagedPoolDescriptor(NUMA)
Paged Pool
• Выгружаемая системная память
• Доступна на PASSIVE,APC уровнях IRQ
• Количество Paged Pool определено в
  nt!ExpNumberOfPagedPool
• Создаётся в nt!InitializePagedPool
• Paged Pool дескрипторы хранятся в
  nt!ExpPagedPoolDescriptor с 1-го индекса
• Один допольнительный Paged Pool дескриптор
  хранится в nt!ExpPagedPoolDescriptor [0]
Session Paged Pool

• Выгружаемая системная память,
  используется в пространстве сессии

• Уникальна для каждого пользователя

• Создаётся в nt!MiInitializeSession
Kernel Pool Descriptor
•    typedef struct _POOL_DESCRIPTOR {
•   /*0x000*/ enum _POOL_TYPE PoolType;
•   /*0x004*/ ULONG32 PoolIndex;
•   /*0x008*/ ULONG32 RunningAllocs;
•   /*0x00C*/ ULONG32 RunningDeAllocs;
•   /*0x010*/ ULONG32 TotalPages;
•   /*0x014*/ ULONG32 TotalBigPages;
•   /*0x018*/ ULONG32 Threshold;
•   /*0x01C*/ VOID*        LockAddress;
•   /*0x020*/ VOID*        PendingFrees;
•   /*0x024*/ LONG32        PendingFreeDepth;
•   /*0x028*/ struct _LIST_ENTRY ListHeads[512];
•        }POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
Kernel Pool Descriptor
• PoolType – тип памяти(Non-Paged, Paged…)
• PoolIndex – индекс Pool Descriptor’a в
  массиве дескрипторов
• PendingFrees – односвязный список чанков,
  ожидающих освобождения
• ListHeads – 512 двусвязных списков
  свободных чанков памяти
PendingFrees

• Pool Descriptor PendingFrees
ListHeads
Описатель чанка памяти(x86)
    typedef struct _POOL_HEADER {
•    /*0x000*/ UINT16      PreviousSize : 9;
•    /*0x000*/ UINT16      PoolIndex : 7;
•    /*0x002*/ UINT16      BlockSize : 9;
•    /*0x002*/ UINT16      PoolType : 7;
•    /*0x004*/ ULONG32 PoolTag;
•     }POOL_HEADER, *PPOOL_HEADER;
Описатель чанка памяти(x64)
    typedef struct _POOL_HEADER {
•    /*0x000*/ UINT16      PreviousSize : 9;
•    /*0x000*/ UINT16      PoolIndex : 7;
•    /*0x002*/ UINT16      BlockSize : 9;
•    /*0x002*/ UINT16      PoolType : 7;
•    /*0x004*/ ULONG32 PoolTag;
•    /*0x008*/ EPROCESS *ProcessBilled;
•     }POOL_HEADER, *PPOOL_HEADER;
Описатель чанка памяти
• BlockSize – (кол-во байт + 0xf) >> 3
• PreviousSize – BlockSize предыдущего чанка
• PoolIndex – индекс соответствующего Pool’a
• PoolType – 0 если свободный
• PoolTag – 4 символа обозначающих какой
  код осуществил аллокацию
• ProcessBilled(x64) – указатель на
  EPROCESS(используется для Quota)
Освобождённый чанк памяти

• Чанки находящиеся в ListHeads содержат 2
 указателя(структура LINK_ENTRY) сразу
 после описателя
Lookaside Lists

• Используются для быстрой (де)аллокации
 малых объёмов памяти(до 256 байт)

• Раздельные списки для Non-Paged, Paged
 памяти

• Определён структурой
 nt!GENERAL_LOOKASIDE_POOL
nt!GENERAL_LOOKASIDE_POOL
typedef struct _GENERAL_LOOKASIDE_POOL{
•           union{
• /*0x000*/        union _SLIST_HEADER ListHead;
• /*0x000*/        struct _SINGLE_LIST_ENTRY SingleListHead;};
• /*0x008*/ UINT16           Depth;
• /*0x00A*/ UINT16           MaximumDepth;
• /*0x00C*/ ULONG32 TotalAllocates;
•           union{
• /*0x010*/        ULONG32 AllocateMisses;
• /*0x010*/        ULONG32 AllocateHits;};
• /*0x014*/ ULONG32 TotalFrees;
•           union{
• /*0x018*/        ULONG32 FreeMisses;
• /*0x018*/        ULONG32 FreeHits;};
nt!GENERAL_LOOKASIDE_POOL
•   /*0x01C*/ enum _POOL_TYPE Type;
•   /*0x020*/ ULONG32 Tag;
•   /*0x024*/ ULONG32 Size;
•   /*0x028*/ VOID* Allocate;
•   /*0x02C*/ VOID* FreeEx;
•   /*0x030*/ struct _LIST_ENTRY ListEntry;
•   /*0x038*/ ULONG32 LastTotalAllocates;
•          union{
•   /*0x03C*/     ULONG32 LastAllocateMisses;
•   /*0x03C*/     ULONG32 LastAllocateHits;};
•   /*0x040*/ ULONG32 Future[2];
•        }GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
Алгоритмы аллокации памяти
• Зависит от объёма и типа памяти
• Различные ф-ии: ExAllocatePool(WithTag,
  WithQuota и т.д.)
• Используются односвязные списки для
  малых(<256 байт) объёмов памяти
• Используются двусвязные списки для
  средних(256 < N < 4080) объёмов памяти
• Используется аллокатор страниц
ExAllocatePoolWithTag
• PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType,
  SIZE_T NumberOfBytes, ULONG Tag)
• Если NumberOfBytes > 4080 – вызов
  nt!MiAllocatePoolPages/nt!ExpAllocateBigPool
• Если PoolType == Paged:
• Если BlockSize <= 32 – запрос Paged Lookaside Lists
• Если PoolType относится к Session и BlockSize <= 25
  – запрос к Session Lookaside Lists
ExAllocatePoolWithTag
• Если PoolType == Non-Paged и BlockSize <= 32 –
  запрос Non-Paged Lookaside Lists

• Поиск первого не пустого ListHeads[n], BlockSize <=
  n < 512

• Если выбранный чанк больше – разделение

• Если чанк запрашиваемой длины не найден –
  расширение Pool’a(Вызов MiAllocatePoolPages)
Разделение чанка памяти
• Если алгоритм вернул чанк большего размера –
  происходит разделение

• Если чанк находится в начале страницы –
  выделить необходимую длину с начала чанка

• Если чанк находится не в начале страницы –
  выделить необходимую длину с конца чанка

• Оставшаяся часть возвращается в ListHeads
Разделение чанка памяти

• Чанк в начале страницы




• Чанк не в начале страницы
Алгоритм деаллокации
• Различные ф-ии: ExFreePool(WithTag, WithQuota…)

• Алгоритм деаллокации “обрабатывает”
  чанк(описатель чанка) памяти – возвращает
  освобождённый чанк в соответствующий список:
  Lookaside(<256 байт), ListHeads<(4080 байт)

• Соединяет смежные чанки

• Освобождает страницы памяти
ExFreePoolWithTag
• VOID ExFreePoolWithTag(PVOID Address, ULONG Tag)
• Если Address выравнен по странице памяти – вызов
  nt!MiFreePoolPages
• Если BlockSize <= 32 – возврат в соответствующий
  (Non-Paged, Paged) Lookaside List

• Если PoolType относится к Session и BlockSize <= 25 –
  возврат в Session Lookaside List
ExFreePoolWithTag
• Если установлен флаг DELAY_FREE
  (ExpPoolFlags&0x200) и кол-во чанков “ждущих”
  деаллокации >= 32 – вызов nt!ExDeferredFreePool
• Если следующий чанк свободный и не выравнен
  по странице памяти – соединить с текущим
• Если предыдущий чанк свободный – соединить с
  текущим
• Если результирующий чанк размером в страницу
  – вызвать nt!MiFreePoolPages
• Добавить чанк в соответствующий ListHeads
Слияние чанков
Generic атаки

• Generic атаки используют алгоритмы
 (де)аллокации памяти – манипулирование
 метаданными(описатель чанка и т.д.) – для
 получения стандартного условия write4
 arbitrary memory write
Перезапись указателей
          (LIST_ENTRY)
• ListHeads содержат двусвязные списки
  свободных чанков, связанных между собой
  структурой LIST_ENTRY
RemoveEntryList(Entry) {
  PLIST_ENTRY Blink;
  PLIST_ENTRY Flink;
  Flink = Entry->Flink; //значение
  Blink = Entry->Blink;//адрес
  Blink->Flink = Flink; // *(адрес) = значение
  Flink->Blink = Blink; // *(значение+4) = адрес
Методы

1. Слияние со следующим чанком

2. Слияние с предыдущим чанком

3. Аллокация из ListHeads[n]

• Не работает с Windows 7 - из-за внедрения
 safe unlinking’a
Safe Unlinking
RemoveEntryList(Entry) {
  PLIST_ENTRY Blink;
  PLIST_ENTRY Flink;
  Flink = Entry->Flink;
  Blink = Entry->Blink;
  if(Blink->Flink != Flink->Blink) KeBugCheckEx();
  Blink->Flink = Flink;
  Flink->Blink = Blink;
Перезапись указателя
         Quota Process
• Pool аллокации использующие
  Quota(ExAllocatePoolWithQuotaTag) хранят
  указатель на объект процесса
• При деалокации Quota освобождается и
  объект процесса разыменовывается
• Перезапись указателя ведёт к memory
  corruption(PspReturnQuota), arbitrary
  memory decrement(ObfDereferenceObject)
• Не работает с Windows 8 Developer Preview
  из-за внедрения nt! ExpPoolQuotaCookie
Перезапись указателя
           Quota Process
• x86



• x64
Перезапись PoolIndex

• PoolIndex описателя чанка обозначает
 индекс Pool’a в соответствующем массиве

• Для Paged Pool’a PoolIndex обозначает
 индекс в массиве nt!ExpPagedPoolDescriptor
• Для Non-Paged Pool’a PoolIndex обозначает
  индекс в массиве
  nt!ExpNonPagedPoolDescriptor, если
  nt!KeNumberNodes > 1
Перезапись PoolIndex
Перезапись PoolIndex
• Формирование невалидного PoolIndex ведёт к
  освобождению чанка в Pool Descriptor
  расположенному по нулевому адресу

• При возврате в контролируемый Pool Descriptor –
  происходит запись адреса освобождённого чанка
  по контролируемому адресу

• Не работает с Windows 8 Developer Preview –
  запрет на аллокацию по нулевому адресу
Generic атаки
• Требуют определённых условий (позиция чанков,
  тип памяти и т.д.)

• С каждой новой версией ОС – гайки
  закручиваются сильнее

• Для уязвимостей некоторого типа трудно
  применимы

• Для таких случаев требуется другой подход…
Custom атаки

• Перезапись не метаданных, а данных чанка




•             Profit?
Custom атаки

• Наилучшие типы данных для перезаписи:

1. Указатели на функции

2. Структуры

• Где взять такие данные?!

• Ядерные объекты!
Custom атаки

• Большинство ядерных объектов содержат
 указатели

• Интерфейсы для создания, изменения,
 чтения, удаления: NtCreateWorkerFactory,
 NtSetInformationWorkerFactory,
 NtQueryInformationWorkerFactory,
 NtClose
Custom атаки

• Использование Kernel Pool Overflow для:

• Arbitrary Code Execution

• Arbitrary Memory Overwrite

• Arbitrary Memory Read(!)
Custom атаки : Code Execution
• typedef struct _KTIMER{

• /*0x000*/   struct _DISPATCHER_HEADER Header;

• /*0x010*/   union _ULARGE_INTEGER DueTime;

• /*0x018*/   struct _LIST_ENTRY TimerListEntry;

• /*0x020*/   struct _KDPC* Dpc;
• /*0x024*/   ULONG32       Period;

•      }KTIMER, *PKTIMER;
Custom атаки : Code Execution
•    typedef struct _KDPC {
•   /*0x000*/ UINT8         Type;
•   /*0x001*/ UINT8         Importance;
•   /*0x002*/ UINT16         Number;
•   /*0x004*/ struct _LIST_ENTRY DpcListEntry;
•   /*0x00C*/ VOID*        DeferredRoutine;
•   /*0x010*/ VOID*       DeferredContext;
•   /*0x014*/ VOID*       SystemArgument1;
•   /*0x018*/ VOID*       SystemArgument2;
•   /*0x01C*/ VOID*       DpcData;
•        }KDPC, *PKDPC;
Custom атаки : Arbitrary Write

• NtSetInformationWorkerFactory
Custom атаки: Arbitrary read

• NtQueryInformationWorkerFactory
Kernel Pool Spray
• Временный VS постоянный(контролируемый)

• Временный – пример NtDeviceIoControlFile,
 ioctl METHOD_BUFFERED

• Постоянный – контроль над временем жизни,
 содержимым
Kernel Pool Spray

• Non-Paged: ObCreateObject – NtCreateTimer,
 NtCreateEvent,
 NtCreateWaitCompletionPacket и т.д.

• Paged: Unicode строки – свойства ядерных
 объектов
Kernel Pool Spray

• В Windows 7 появился специальный

 системный вызов для удобного

 манипулирования Kernel Pool’ом

• NtAllocateReserveObject
Kernel Pool Explotation
           Mitigations
• Максимальное кол-во проверок

 метаданных (аналог многочисленных защит

 в Userland Heap)

• Cookie для ядерных объектов?!
What’s the heck!


• Dude, where is the demo???


• Where is the super private 0day?
Not this time folks!

• Drop me an e-mail


• Or


• Wait 0-day time show this evening
Вопросы!?

• Контакты:


• Twitter.com/NTarakanov


• Nikita.Tarakanov.Researcher@gmail.com
References

• Kortchinsky[2008] – Kostya Kortchinsky

• Real-World Kernel Pool Exploitation,

• SyScan 2008 Hong Kong

• Tarjei Mandt[2010] – Kernel Pool Explotation
  at Infiltrate
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8

More Related Content

What's hot

Ruscrypto CTF 2010 Full Disclosure
Ruscrypto CTF 2010 Full DisclosureRuscrypto CTF 2010 Full Disclosure
Ruscrypto CTF 2010 Full DisclosureDmitry Evteev
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3Technopark
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012dmalykhanov
 
«Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus
 «Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus «Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus
«Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus0xdec0de
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровPositive Hack Days
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Некриптографическое исследование носителей православной криптографии
Некриптографическое исследование носителей  православной криптографииНекриптографическое исследование носителей  православной криптографии
Некриптографическое исследование носителей православной криптографииSergey Soldatov
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7Technopark
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3Technopark
 

What's hot (20)

Ruscrypto CTF 2010 Full Disclosure
Ruscrypto CTF 2010 Full DisclosureRuscrypto CTF 2010 Full Disclosure
Ruscrypto CTF 2010 Full Disclosure
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
«Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus
 «Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus «Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus
«Introduction to malware reverse engineering» by Sergey Kharyuk aka ximerus
 
Perl in da shell
Perl in da shellPerl in da shell
Perl in da shell
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Некриптографическое исследование носителей православной криптографии
Некриптографическое исследование носителей  православной криптографииНекриптографическое исследование носителей  православной криптографии
Некриптографическое исследование носителей православной криптографии
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 

Similar to Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8

Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk0xdec0de
 
Лекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и системЛекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и системpianist2317
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicVadim Tsesko
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Ontico
 
Waits monitoring in PostgreSQL
Waits monitoring in PostgreSQLWaits monitoring in PostgreSQL
Waits monitoring in PostgreSQLIldus Kurbangaliev
 
Jouravski kickstart1
Jouravski kickstart1Jouravski kickstart1
Jouravski kickstart1kuchinskaya
 
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...Yandex
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Oleg Tsarev
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьAndrey Rebrov
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)Ontico
 
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019corehard_by
 
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...Oleg Lipin
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 

Similar to Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8 (20)

Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk
 
Лекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и системЛекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и систем
 
Лекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и системЛекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и систем
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Waits monitoring in PostgreSQL
Waits monitoring in PostgreSQLWaits monitoring in PostgreSQL
Waits monitoring in PostgreSQL
 
Jouravski kickstart1
Jouravski kickstart1Jouravski kickstart1
Jouravski kickstart1
 
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...
Павел Пушкарев - Базы данных: легковесная реляционная высокопроизводительная ...
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинопись
 
Tarantool
TarantoolTarantool
Tarantool
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)
 
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
 
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...VDS: обнаружение, выявление причин и устранение проблемных ситуаций.  Диагнос...
VDS: обнаружение, выявление причин и устранение проблемных ситуаций. Диагнос...
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 

More from DefconRussia

[Defcon Russia #29] Борис Савков - Bare-metal programming на примере Raspber...
[Defcon Russia #29] Борис Савков -  Bare-metal programming на примере Raspber...[Defcon Russia #29] Борис Савков -  Bare-metal programming на примере Raspber...
[Defcon Russia #29] Борис Савков - Bare-metal programming на примере Raspber...DefconRussia
 
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...DefconRussia
 
[Defcon Russia #29] Алексей Тюрин - Spring autobinding
[Defcon Russia #29] Алексей Тюрин - Spring autobinding[Defcon Russia #29] Алексей Тюрин - Spring autobinding
[Defcon Russia #29] Алексей Тюрин - Spring autobindingDefconRussia
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
 
Георгий Зайцев - Reversing golang
Георгий Зайцев - Reversing golangГеоргий Зайцев - Reversing golang
Георгий Зайцев - Reversing golangDefconRussia
 
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC [DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC DefconRussia
 
Cisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneCisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneDefconRussia
 
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...DefconRussia
 
HTTP HOST header attacks
HTTP HOST header attacksHTTP HOST header attacks
HTTP HOST header attacksDefconRussia
 
Attacks on tacacs - Алексей Тюрин
Attacks on tacacs - Алексей ТюринAttacks on tacacs - Алексей Тюрин
Attacks on tacacs - Алексей ТюринDefconRussia
 
Weakpass - defcon russia 23
Weakpass - defcon russia 23Weakpass - defcon russia 23
Weakpass - defcon russia 23DefconRussia
 
nosymbols - defcon russia 20
nosymbols - defcon russia 20nosymbols - defcon russia 20
nosymbols - defcon russia 20DefconRussia
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Zn task - defcon russia 20
Zn task  - defcon russia 20Zn task  - defcon russia 20
Zn task - defcon russia 20DefconRussia
 
Vm ware fuzzing - defcon russia 20
Vm ware fuzzing  - defcon russia 20Vm ware fuzzing  - defcon russia 20
Vm ware fuzzing - defcon russia 20DefconRussia
 
Nedospasov defcon russia 23
Nedospasov defcon russia 23Nedospasov defcon russia 23
Nedospasov defcon russia 23DefconRussia
 
Advanced cfg bypass on adobe flash player 18 defcon russia 23
Advanced cfg bypass on adobe flash player 18 defcon russia 23Advanced cfg bypass on adobe flash player 18 defcon russia 23
Advanced cfg bypass on adobe flash player 18 defcon russia 23DefconRussia
 
Miasm defcon russia 23
Miasm defcon russia 23Miasm defcon russia 23
Miasm defcon russia 23DefconRussia
 
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...DefconRussia
 
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условиях
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условияхSergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условиях
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условияхDefconRussia
 

More from DefconRussia (20)

[Defcon Russia #29] Борис Савков - Bare-metal programming на примере Raspber...
[Defcon Russia #29] Борис Савков -  Bare-metal programming на примере Raspber...[Defcon Russia #29] Борис Савков -  Bare-metal programming на примере Raspber...
[Defcon Russia #29] Борис Савков - Bare-metal programming на примере Raspber...
 
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...
[Defcon Russia #29] Александр Ермолов - Safeguarding rootkits: Intel Boot Gua...
 
[Defcon Russia #29] Алексей Тюрин - Spring autobinding
[Defcon Russia #29] Алексей Тюрин - Spring autobinding[Defcon Russia #29] Алексей Тюрин - Spring autobinding
[Defcon Russia #29] Алексей Тюрин - Spring autobinding
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
 
Георгий Зайцев - Reversing golang
Георгий Зайцев - Reversing golangГеоргий Зайцев - Reversing golang
Георгий Зайцев - Reversing golang
 
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC [DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC
[DCG 25] Александр Большев - Never Trust Your Inputs or How To Fool an ADC
 
Cisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneCisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-one
 
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...
Олег Купреев - Обзор и демонстрация нюансов и трюков из области беспроводных ...
 
HTTP HOST header attacks
HTTP HOST header attacksHTTP HOST header attacks
HTTP HOST header attacks
 
Attacks on tacacs - Алексей Тюрин
Attacks on tacacs - Алексей ТюринAttacks on tacacs - Алексей Тюрин
Attacks on tacacs - Алексей Тюрин
 
Weakpass - defcon russia 23
Weakpass - defcon russia 23Weakpass - defcon russia 23
Weakpass - defcon russia 23
 
nosymbols - defcon russia 20
nosymbols - defcon russia 20nosymbols - defcon russia 20
nosymbols - defcon russia 20
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Zn task - defcon russia 20
Zn task  - defcon russia 20Zn task  - defcon russia 20
Zn task - defcon russia 20
 
Vm ware fuzzing - defcon russia 20
Vm ware fuzzing  - defcon russia 20Vm ware fuzzing  - defcon russia 20
Vm ware fuzzing - defcon russia 20
 
Nedospasov defcon russia 23
Nedospasov defcon russia 23Nedospasov defcon russia 23
Nedospasov defcon russia 23
 
Advanced cfg bypass on adobe flash player 18 defcon russia 23
Advanced cfg bypass on adobe flash player 18 defcon russia 23Advanced cfg bypass on adobe flash player 18 defcon russia 23
Advanced cfg bypass on adobe flash player 18 defcon russia 23
 
Miasm defcon russia 23
Miasm defcon russia 23Miasm defcon russia 23
Miasm defcon russia 23
 
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...
Andrey Belenko, Alexey Troshichev - Внутреннее устройство и безопасность iClo...
 
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условиях
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условияхSergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условиях
Sergey Belov - Покажите нам Impact! Доказываем угрозу в сложных условиях
 

Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8

  • 1. Kernel Pool Overflow: от Windows XP до Windows 8 Никита Тараканов CISS Research Team
  • 2. Kernel Pool • Используется для работы с динамической памятью в пространстве ядра • Память доступна всем компонентам, работающим в пространстве ядра • Различные типы памяти • Каждый Pool описан структурой nt!_POOL_DESCRIPTOR
  • 3. Типы памяти • Определены в nt!_POOL_TYPE • Много разновидностей – с каждым новым выпуском Windows кол-во увеличивается • Три основных типа: Non-Paged, Paged, Session
  • 4. nt!_POOL_TYPE(7 SP1) • typedef enum _POOL_TYPE{ • NonPagedPool = 0 /*0x0*/, • PagedPool = 1 /*0x1*/, • NonPagedPoolMustSucceed = 2 /*0x2*/, • DontUseThisType = 3 /*0x3*/, • NonPagedPoolCacheAligned = 4 /*0x4*/, • PagedPoolCacheAligned = 5 /*0x5*/, • NonPagedPoolCacheAlignedMustS = 6 /*0x6*/, • MaxPoolType = 7 /*0x7*/, • NonPagedPoolSession = 32 /*0x20*/, • PagedPoolSession = 33 /*0x21*/, • NonPagedPoolMustSucceedSession = 34 /*0x22*/, • DontUseThisTypeSession = 35 /*0x23*/, • NonPagedPoolCacheAlignedSession = 36 /*0x24*/, • PagedPoolCacheAlignedSession = 37 /*0x25*/, • NonPagedPoolCacheAlignedMustSSession = 38 /*0x26*/
  • 5. nt!_POOL_TYPE(8 Dev. Prev.) • Новые типы Pool’a – Not Executable: 1. NonPagedPoolNx = 512 /*0x200*/ 2. NonPagedPoolNxCacheAligned = 516 /*0x204*/ 3. NonPagedPoolSessionNx = 544 /*0x220*/
  • 6. Non-Paged Pool • Невыгружаемая системная память • Доступна на любом уровне IRQ • Количество Non-Paged Pool определено в nt!ExpNumberOfNonPagedPool и зависит от количества нодов nt!KeNumberNodes • Создаётся в nt!InitializePool • Указатель хранится в nt!PoolVector[0] • Указатель хранится в массиве nt!ExpNonPagedPoolDescriptor(NUMA)
  • 7. Paged Pool • Выгружаемая системная память • Доступна на PASSIVE,APC уровнях IRQ • Количество Paged Pool определено в nt!ExpNumberOfPagedPool • Создаётся в nt!InitializePagedPool • Paged Pool дескрипторы хранятся в nt!ExpPagedPoolDescriptor с 1-го индекса • Один допольнительный Paged Pool дескриптор хранится в nt!ExpPagedPoolDescriptor [0]
  • 8. Session Paged Pool • Выгружаемая системная память, используется в пространстве сессии • Уникальна для каждого пользователя • Создаётся в nt!MiInitializeSession
  • 9. Kernel Pool Descriptor • typedef struct _POOL_DESCRIPTOR { • /*0x000*/ enum _POOL_TYPE PoolType; • /*0x004*/ ULONG32 PoolIndex; • /*0x008*/ ULONG32 RunningAllocs; • /*0x00C*/ ULONG32 RunningDeAllocs; • /*0x010*/ ULONG32 TotalPages; • /*0x014*/ ULONG32 TotalBigPages; • /*0x018*/ ULONG32 Threshold; • /*0x01C*/ VOID* LockAddress; • /*0x020*/ VOID* PendingFrees; • /*0x024*/ LONG32 PendingFreeDepth; • /*0x028*/ struct _LIST_ENTRY ListHeads[512]; • }POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
  • 10. Kernel Pool Descriptor • PoolType – тип памяти(Non-Paged, Paged…) • PoolIndex – индекс Pool Descriptor’a в массиве дескрипторов • PendingFrees – односвязный список чанков, ожидающих освобождения • ListHeads – 512 двусвязных списков свободных чанков памяти
  • 13. Описатель чанка памяти(x86) typedef struct _POOL_HEADER { • /*0x000*/ UINT16 PreviousSize : 9; • /*0x000*/ UINT16 PoolIndex : 7; • /*0x002*/ UINT16 BlockSize : 9; • /*0x002*/ UINT16 PoolType : 7; • /*0x004*/ ULONG32 PoolTag; • }POOL_HEADER, *PPOOL_HEADER;
  • 14. Описатель чанка памяти(x64) typedef struct _POOL_HEADER { • /*0x000*/ UINT16 PreviousSize : 9; • /*0x000*/ UINT16 PoolIndex : 7; • /*0x002*/ UINT16 BlockSize : 9; • /*0x002*/ UINT16 PoolType : 7; • /*0x004*/ ULONG32 PoolTag; • /*0x008*/ EPROCESS *ProcessBilled; • }POOL_HEADER, *PPOOL_HEADER;
  • 15. Описатель чанка памяти • BlockSize – (кол-во байт + 0xf) >> 3 • PreviousSize – BlockSize предыдущего чанка • PoolIndex – индекс соответствующего Pool’a • PoolType – 0 если свободный • PoolTag – 4 символа обозначающих какой код осуществил аллокацию • ProcessBilled(x64) – указатель на EPROCESS(используется для Quota)
  • 16. Освобождённый чанк памяти • Чанки находящиеся в ListHeads содержат 2 указателя(структура LINK_ENTRY) сразу после описателя
  • 17. Lookaside Lists • Используются для быстрой (де)аллокации малых объёмов памяти(до 256 байт) • Раздельные списки для Non-Paged, Paged памяти • Определён структурой nt!GENERAL_LOOKASIDE_POOL
  • 18. nt!GENERAL_LOOKASIDE_POOL typedef struct _GENERAL_LOOKASIDE_POOL{ • union{ • /*0x000*/ union _SLIST_HEADER ListHead; • /*0x000*/ struct _SINGLE_LIST_ENTRY SingleListHead;}; • /*0x008*/ UINT16 Depth; • /*0x00A*/ UINT16 MaximumDepth; • /*0x00C*/ ULONG32 TotalAllocates; • union{ • /*0x010*/ ULONG32 AllocateMisses; • /*0x010*/ ULONG32 AllocateHits;}; • /*0x014*/ ULONG32 TotalFrees; • union{ • /*0x018*/ ULONG32 FreeMisses; • /*0x018*/ ULONG32 FreeHits;};
  • 19. nt!GENERAL_LOOKASIDE_POOL • /*0x01C*/ enum _POOL_TYPE Type; • /*0x020*/ ULONG32 Tag; • /*0x024*/ ULONG32 Size; • /*0x028*/ VOID* Allocate; • /*0x02C*/ VOID* FreeEx; • /*0x030*/ struct _LIST_ENTRY ListEntry; • /*0x038*/ ULONG32 LastTotalAllocates; • union{ • /*0x03C*/ ULONG32 LastAllocateMisses; • /*0x03C*/ ULONG32 LastAllocateHits;}; • /*0x040*/ ULONG32 Future[2]; • }GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
  • 20. Алгоритмы аллокации памяти • Зависит от объёма и типа памяти • Различные ф-ии: ExAllocatePool(WithTag, WithQuota и т.д.) • Используются односвязные списки для малых(<256 байт) объёмов памяти • Используются двусвязные списки для средних(256 < N < 4080) объёмов памяти • Используется аллокатор страниц
  • 21. ExAllocatePoolWithTag • PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG Tag) • Если NumberOfBytes > 4080 – вызов nt!MiAllocatePoolPages/nt!ExpAllocateBigPool • Если PoolType == Paged: • Если BlockSize <= 32 – запрос Paged Lookaside Lists • Если PoolType относится к Session и BlockSize <= 25 – запрос к Session Lookaside Lists
  • 22. ExAllocatePoolWithTag • Если PoolType == Non-Paged и BlockSize <= 32 – запрос Non-Paged Lookaside Lists • Поиск первого не пустого ListHeads[n], BlockSize <= n < 512 • Если выбранный чанк больше – разделение • Если чанк запрашиваемой длины не найден – расширение Pool’a(Вызов MiAllocatePoolPages)
  • 23. Разделение чанка памяти • Если алгоритм вернул чанк большего размера – происходит разделение • Если чанк находится в начале страницы – выделить необходимую длину с начала чанка • Если чанк находится не в начале страницы – выделить необходимую длину с конца чанка • Оставшаяся часть возвращается в ListHeads
  • 24. Разделение чанка памяти • Чанк в начале страницы • Чанк не в начале страницы
  • 25. Алгоритм деаллокации • Различные ф-ии: ExFreePool(WithTag, WithQuota…) • Алгоритм деаллокации “обрабатывает” чанк(описатель чанка) памяти – возвращает освобождённый чанк в соответствующий список: Lookaside(<256 байт), ListHeads<(4080 байт) • Соединяет смежные чанки • Освобождает страницы памяти
  • 26. ExFreePoolWithTag • VOID ExFreePoolWithTag(PVOID Address, ULONG Tag) • Если Address выравнен по странице памяти – вызов nt!MiFreePoolPages • Если BlockSize <= 32 – возврат в соответствующий (Non-Paged, Paged) Lookaside List • Если PoolType относится к Session и BlockSize <= 25 – возврат в Session Lookaside List
  • 27. ExFreePoolWithTag • Если установлен флаг DELAY_FREE (ExpPoolFlags&0x200) и кол-во чанков “ждущих” деаллокации >= 32 – вызов nt!ExDeferredFreePool • Если следующий чанк свободный и не выравнен по странице памяти – соединить с текущим • Если предыдущий чанк свободный – соединить с текущим • Если результирующий чанк размером в страницу – вызвать nt!MiFreePoolPages • Добавить чанк в соответствующий ListHeads
  • 29. Generic атаки • Generic атаки используют алгоритмы (де)аллокации памяти – манипулирование метаданными(описатель чанка и т.д.) – для получения стандартного условия write4 arbitrary memory write
  • 30. Перезапись указателей (LIST_ENTRY) • ListHeads содержат двусвязные списки свободных чанков, связанных между собой структурой LIST_ENTRY RemoveEntryList(Entry) { PLIST_ENTRY Blink; PLIST_ENTRY Flink; Flink = Entry->Flink; //значение Blink = Entry->Blink;//адрес Blink->Flink = Flink; // *(адрес) = значение Flink->Blink = Blink; // *(значение+4) = адрес
  • 31. Методы 1. Слияние со следующим чанком 2. Слияние с предыдущим чанком 3. Аллокация из ListHeads[n] • Не работает с Windows 7 - из-за внедрения safe unlinking’a
  • 32. Safe Unlinking RemoveEntryList(Entry) { PLIST_ENTRY Blink; PLIST_ENTRY Flink; Flink = Entry->Flink; Blink = Entry->Blink; if(Blink->Flink != Flink->Blink) KeBugCheckEx(); Blink->Flink = Flink; Flink->Blink = Blink;
  • 33. Перезапись указателя Quota Process • Pool аллокации использующие Quota(ExAllocatePoolWithQuotaTag) хранят указатель на объект процесса • При деалокации Quota освобождается и объект процесса разыменовывается • Перезапись указателя ведёт к memory corruption(PspReturnQuota), arbitrary memory decrement(ObfDereferenceObject) • Не работает с Windows 8 Developer Preview из-за внедрения nt! ExpPoolQuotaCookie
  • 34. Перезапись указателя Quota Process • x86 • x64
  • 35. Перезапись PoolIndex • PoolIndex описателя чанка обозначает индекс Pool’a в соответствующем массиве • Для Paged Pool’a PoolIndex обозначает индекс в массиве nt!ExpPagedPoolDescriptor • Для Non-Paged Pool’a PoolIndex обозначает индекс в массиве nt!ExpNonPagedPoolDescriptor, если nt!KeNumberNodes > 1
  • 37. Перезапись PoolIndex • Формирование невалидного PoolIndex ведёт к освобождению чанка в Pool Descriptor расположенному по нулевому адресу • При возврате в контролируемый Pool Descriptor – происходит запись адреса освобождённого чанка по контролируемому адресу • Не работает с Windows 8 Developer Preview – запрет на аллокацию по нулевому адресу
  • 38. Generic атаки • Требуют определённых условий (позиция чанков, тип памяти и т.д.) • С каждой новой версией ОС – гайки закручиваются сильнее • Для уязвимостей некоторого типа трудно применимы • Для таких случаев требуется другой подход…
  • 39. Custom атаки • Перезапись не метаданных, а данных чанка • Profit?
  • 40. Custom атаки • Наилучшие типы данных для перезаписи: 1. Указатели на функции 2. Структуры • Где взять такие данные?! • Ядерные объекты!
  • 41. Custom атаки • Большинство ядерных объектов содержат указатели • Интерфейсы для создания, изменения, чтения, удаления: NtCreateWorkerFactory, NtSetInformationWorkerFactory, NtQueryInformationWorkerFactory, NtClose
  • 42. Custom атаки • Использование Kernel Pool Overflow для: • Arbitrary Code Execution • Arbitrary Memory Overwrite • Arbitrary Memory Read(!)
  • 43. Custom атаки : Code Execution • typedef struct _KTIMER{ • /*0x000*/ struct _DISPATCHER_HEADER Header; • /*0x010*/ union _ULARGE_INTEGER DueTime; • /*0x018*/ struct _LIST_ENTRY TimerListEntry; • /*0x020*/ struct _KDPC* Dpc; • /*0x024*/ ULONG32 Period; • }KTIMER, *PKTIMER;
  • 44. Custom атаки : Code Execution • typedef struct _KDPC { • /*0x000*/ UINT8 Type; • /*0x001*/ UINT8 Importance; • /*0x002*/ UINT16 Number; • /*0x004*/ struct _LIST_ENTRY DpcListEntry; • /*0x00C*/ VOID* DeferredRoutine; • /*0x010*/ VOID* DeferredContext; • /*0x014*/ VOID* SystemArgument1; • /*0x018*/ VOID* SystemArgument2; • /*0x01C*/ VOID* DpcData; • }KDPC, *PKDPC;
  • 45. Custom атаки : Arbitrary Write • NtSetInformationWorkerFactory
  • 46. Custom атаки: Arbitrary read • NtQueryInformationWorkerFactory
  • 47. Kernel Pool Spray • Временный VS постоянный(контролируемый) • Временный – пример NtDeviceIoControlFile, ioctl METHOD_BUFFERED • Постоянный – контроль над временем жизни, содержимым
  • 48. Kernel Pool Spray • Non-Paged: ObCreateObject – NtCreateTimer, NtCreateEvent, NtCreateWaitCompletionPacket и т.д. • Paged: Unicode строки – свойства ядерных объектов
  • 49. Kernel Pool Spray • В Windows 7 появился специальный системный вызов для удобного манипулирования Kernel Pool’ом • NtAllocateReserveObject
  • 50. Kernel Pool Explotation Mitigations • Максимальное кол-во проверок метаданных (аналог многочисленных защит в Userland Heap) • Cookie для ядерных объектов?!
  • 51. What’s the heck! • Dude, where is the demo??? • Where is the super private 0day?
  • 52. Not this time folks! • Drop me an e-mail • Or • Wait 0-day time show this evening
  • 54. References • Kortchinsky[2008] – Kostya Kortchinsky • Real-World Kernel Pool Exploitation, • SyScan 2008 Hong Kong • Tarjei Mandt[2010] – Kernel Pool Explotation at Infiltrate