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 ,и в зависимости от его состояния либо прихлопывает засбоившее приложение, либо передает управление отладчику (или, как вариант, Доктору Ватсону). |