Обзор эксплойтов Крис Касперски Хакер, номер #094, стр. 094-054-4 В NT существует всего 32 уровня (см. рис. 6), пронумерованных целыми числами от 0 до 31. Уровень 0 имеет минимальный приоритет, 31 — максимальный. Нормальное выполнение потока происходит на нулевом уровне, называемого пассивным (PASSIVE), и его может прерывать любое асинхронное событие, возникающее в системе. При этом операционная система повышает текущий IRQL до уровня возникшего прерывания и передает управление его ISR (Interrupt Service Routine – Процедура обработки прерывания), предварительно сохранив состояние текущего обработчика. Приоритеты с номерами 1 и 2 отданы под программные прерывания (например, возникающие при ошибке обращения к странице памяти, вытесненной на диск), а все остальные обслуживают аппаратные прерывания от периферийных устройств, причем прерывания от таймера имеют приоритет 28. Покажем, как происходит обработка прерываний, поступающих от устройств. Допустим, поток A работает на уровне IRQL, равном PASSIVE_LEVEL. Устройство Device 1 возбуждает аппаратное прерывание с уровнем DIRQL (Device IRQL, то есть IRQL с номером от 3 до 31 включительно). Ось прерывает выполнение Потока A, повышает IRQL до DIRQL и передает управление на ISR-устройства Device 1. Обработчик прерывания обращается к устройству Device 1, делает с ним все, что оно требует, ставит в очередь отложенную процедуру DpcForISR для последующей обработки и понижает IRQL до прежнего уровня. Отложенные процедуры Deferred Procedure Calls (сокращено — DPCs) выполняются на IRQL, равном 2 (DISPATCH_LEVEL), и потому не могут начать свою работу вплоть до выхода из ISR. Прерывания, возникающие во время выполнения ISR, маскируются. Если прерывание возникнет во время выполнения DpcForISR, то операционная система прервет ее работу, передаст управление ISR, который поставит в очередь еще одну отложенную процедуру, и вновь возвратится в DpcForISR. Таким образом, сколько бы прерываний ни возникало, отложенные процедуры обрабатываются последовательно, в порядке очереди. На двухпроцессорных машинах картина несколько усложняется (см. рис. 8). Допустим, что во время обработки отложенной процедуры DpcForIsr, выполняющейся на процессоре 0, устройство Device 1 вновь сгенерировало сигнал прерывания, посланный процессору 1 (процессор 0 еще не успел завершить обработку ISR и не понизил IRQL). Ось повышает IRQL процессора 1 до DIRQL и передает управление на IRS-устройства Device 1, ставя отложенную процедуру DpcForIsr в очередь. Когда ISR на обоих процессорах завершаются, система понижает IRQL — и начинается выполнение отложенной процедуры DpcForIsr, стоящей как в очереди процессора 0, так и в очереди процессора 1. Да-да! Процедура DpcForIsr исполняется сразу на обоих процессорах, одновременно отвечая за обработку двух прерываний от одного устройства! Как вам это нравится?! В такой ситуации очень легко превратить совместно используемые данные в мешанину, возвратив неожиданный результат или завесив систему, вызвав BSOD. А теперь разберемся с дампами памяти, полученными johnny cache. Распаковав архив crash2.zip, мы увидим три файла: crash2.txt — краткое описание содержимого, crash2.pcap — трафик, собранный sniffer'ом, и MEMORY.DMP — полный дамп памяти. Вот он-то нам и нужен! Для его анализа необходимо иметь либо DDK для XP (DDK для W2K не подходит), либо последнюю версию Microsoft Debugging Tools, которую можно бесплатно скачать с www.microsoft.com/whdc/devtools/debugging/default.mspx. |