Понимание ошибки Pool Coruption часть 2 (переполнение буфера)

Автор: admin | 09.08.2015

В первой части мы рассмотрели проблему, когда драйвер перезаписывает данные в страницах чужого пула. В этой части мы рассмотрим как можно определить проблемный драйвер.

 

Как уже было сказано единственный путь определение проблемного драйвера это использование утилиты Driver Verifier. При этом используется механизм специального пула. Суть его работы представлена на изображении ниже.

 

Для каждого такого специального пула выделяется 4Кб памяти и такой пул хранится в собственной странице.

Область обозначенная как “Slop bytes” используется при проверке освобождения памяти, если здесь происходит какая-либо попытка освободить память генерируется крах и указывается драйвер, который это делает.

Область обозначенная как “Guard Page No Access” используется для отслеживания попытки записи в нее. Если это происходит генерируется крах и указывается драйвер, который это делает.

По умолчанию специальный пул отключен, давайте активируем его и проверим работу на NotMyFault из первой части. Вначале запускаем NotMyFault.exe она загружает драйвер в память, теперь выполняем:

verifier /flags 1 /driver myfault.sys

и перегружаем компьютер.

Запускаем notmyfault и выбираем “buffer overflow” и нажимаем “Crash”.

Выполняем анализ дампа.

Microsoft (R) Windows Debugger Version 6.3.9600.17298 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:Downloads!Mini080915-04.dmp]
Mini Kernel Dump File: Only registers and stack trace are available


************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       srv*C:Symbols*http://msdl.microsoft.com/download/symbols
Symbol search path is: srv*C:Symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2008/Windows Vista Kernel Version 6002 (Service Pack 2) UP Free x86 compatible
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 6002.18005.x86fre.lh_sp2rtm.090410-1830
Machine Name:
Kernel base = 0x81a08000 PsLoadedModuleList = 0x81b1fc70
Debug session time: Sun Aug  9 15:32:55.687 2015 (UTC + 3:00)
System Uptime: 0 days 0:04:00.344
Loading Kernel Symbols
...............................................................
................................................................
.........................
Loading User Symbols
Loading unloaded module list
....
Unable to load image myfault.sys, Win32 error 0n2
*** ERROR: Module load completed but symbols could not be loaded for myfault.sys
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 100000D6, {a3b95000, 1, 9ab1561d, 0}


Could not read faulting driver name
Probably caused by : myfault.sys ( myfault+61d )

Followup: MachineOwner
---------

kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION (d6)
N bytes of memory was allocated and more than N bytes are being referenced.
This cannot be protected by try-except.
When possible, the guilty driver's name (Unicode string) is printed on
the bugcheck screen and saved in KiBugCheckDriver.
Arguments:
Arg1: a3b95000, memory referenced
Arg2: 00000001, value 0 = read operation, 1 = write operation
Arg3: 9ab1561d, if non-zero, the address which referenced memory.
Arg4: 00000000, (reserved)

Debugging Details:
------------------


Could not read faulting driver name

WRITE_ADDRESS: GetPointerFromAddress: unable to read from 81b3f868
Unable to read MiSystemVaType memory at 81b1f420
a3b95000

FAULTING_IP:
myfault+61d
9ab1561d 880c02          mov     byte ptr [edx+eax],cl

MM_INTERNAL_CODE:  0

CUSTOMER_CRASH_COUNT:  4

DEFAULT_BUCKET_ID:  COMMON_SYSTEM_FAULT

BUGCHECK_STR:  0xD6

PROCESS_NAME:  NotMyfault.exe

CURRENT_IRQL:  0

ANALYSIS_VERSION: 6.3.9600.17298 (debuggers(dbg).141024-1500) amd64fre

LAST_CONTROL_TRANSFER:  from 9ab15a24 to 9ab1561d

STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
9afcabc8 9ab15a24 a3a4ef68 9afcac0c 9ab15b26 myfault+0x61d
9afcabd4 9ab15b26 9a52a990 00000001 00000000 myfault+0xa24
9afcac0c 81cea6be 9a49adf0 a3a4ef68 9a52a990 myfault+0xb26
9afcac30 81a4c92d a3a4efd8 a3a4ef68 9a49adf0 nt!IovCallDriver+0x23f
9afcac44 81c4e6a1 9a52a990 a3a4ef68 a3a4efd8 nt!IofCallDriver+0x1b
9afcac64 81c4ee46 9a49adf0 9a52a990 00000000 nt!IopSynchronousServiceTail+0x1d9
9afcad00 81c4ff10 9a49adf0 a3a4ef68 00000000 nt!IopXxxControlFile+0x6b7
9afcad34 81a52c7a 00000090 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
9afcad34 77435e74 00000090 00000000 00000000 nt!KiFastCallEntry+0x12a
0025f294 00000000 00000000 00000000 00000000 0x77435e74


STACK_COMMAND:  kb

FOLLOWUP_IP:
myfault+61d
9ab1561d 880c02          mov     byte ptr [edx+eax],cl

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  myfault+61d

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: myfault

IMAGE_NAME:  myfault.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4f806ca0

FAILURE_BUCKET_ID:  0xD6_myfault+61d

BUCKET_ID:  0xD6_myfault+61d

ANALYSIS_SOURCE:  KM

FAILURE_ID_HASH_STRING:  km:0xd6_myfault+61d

FAILURE_ID_HASH:  {5b7d79f2-2066-4a9a-3bdc-50cdc9e973f2}

Followup: MachineOwner
---------

Как видим, благодаря Driver Verifier и опции специальный пул, определение подобных ошибок намного упрощается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *