Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

SEH на службе у контрреволюции

Крис Касперски aka мыщъх

Спецвыпуск Xakep, номер #045, стр. 045-048-1


Руководство по перезаписи SEH-обработчика

Перезапись SEH-обработчика – это модный и относительно молодой механизм борьбы с защитой от переполнения буферов в Windows 2003 Server, также находящий себе и другие применения. Это отличный способ перехвата управления и подавления сообщений о критических ошибках, демаскирующих факт атаки.

Структурной обработкой исключений (Structured Exception Handling – SEH, в шутку расшифровываемый как Sexual Exception Handling) называется механизм, позволяющий приложениям получать управление при возникновении исключительных ситуаций (например, нарушениях доступа к памяти, делении на ноль, выполнении запрещенной инструкции) и обрабатывать их самостоятельно, не вмешивая в это операционную систему. Необработанные исключения приводят к аварийному завершению приложения, обычно сопровождающемуся всем известным окном "Программа выполнила недопустимую операцию и будет закрыта".

Указатели на SEH-обработчики в подавляющем большинстве случаев располагаются в стеке, в так называемых SEH-фреймах, и переполняющиеся буфера могут затирать их. Перезапись SEH-фреймов обычно преследует две цели: перехват управления путем подмены SEH-обработчика и подавление аварийного завершения программы при возникновении исключения. Защита от переполнения буфера, встроенная в Windows 2003 Server, как и многие другие защиты данного типа, функционирует именно на основе SEH. Перехватывая SEH-обработчик и подменяя его своим, мы тем самым перекрываем кислород защите, и она не срабатывает.

Захватывающие перспективы, не правда ли? Во всяком случае, они стоят того, чтобы в них разобраться!

Кратко о структурных исключениях

Адрес текущего SEH-фрейма содержится в двойном слове по смещению ноль от селектора FS, для извлечения которого можно воспользоваться следующей ассемблерной абракадаброй:

mov eax,FS:[00000000h]

mov my_var,eax.

Он указывает на структуру типа EXCEPTION_REGISTRATION, прототип которой описывается так:

Листинг

Описание структуры EXCEPTION_REGISTRATION

_EXCEPTION_REGISTRATION struc

prev dd ? ; адрес предыдущего SEH-фрейма

handler dd ? ; адрес SEH-обработчика

_EXCEPTION_REGISTRATION ends

При возбуждении исключения управление передается текущему SEH-обработчику. Проанализировав ситуацию, SEH-обработчик, который представляет собой обычную cdecl-функцию, должен возвратить либо ExceptionContinueExecution, сообщая операционной системе, что исключение успешно обработано и исполнение программы может быть продолжено, либо ExceptionContinueSearch, если он не знает, что с этим исключением делать, и тогда операционная система переходит к следующему обработчику в цепочке (собственно говоря, возвращать управление необязательно, и SEH-обработчик может удерживать его хоть до бесконечности, как обработчики, установленные shell-кодом. обычно и поступают).

Последним идет обработчик, назначенный операционной системой по умолчанию. Видя, что дело труба и никто с исключением не справляется, он лезет в реестр, извлекает оттуда ключ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug ,и в зависимости от его состояния либо прихлопывает засбоившее приложение, либо передает управление отладчику (или, как вариант, Доктору Ватсону).

Содержание  Вперед на стр. 045-048-2