Категория > Новости > Железный бряк. Используем хардверные брейк-пойнты в пентестерских целях - «Новости»

Железный бряк. Используем хардверные брейк-пойнты в пентестерских целях - «Новости»


28-10-2023, 00:00. Автор: Эрнест
AddVectoredExceptionHandler().
PVOID AddVectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler)


  • FirstHandler — вызывать обра­бот­чик рань­ше всех ранее зарегис­три­рован­ных обра­бот­чиков (зна­чение CALL_FIRST) или пос­ле всех (зна­чение CALL_LAST);


  • VectoredHandler — адрес фун­кции обра­бот­чика. Эта фун­кция дол­жна воз­вра­щать EXCEPTION_CONTINUE_EXECUTION. Обра­бот­чики далее не выпол­няют­ся, обра­бот­ка средс­тва­ми SEH не про­изво­дит­ся, управле­ние переда­ется в ту точ­ку прог­раммы, из которой было выз­вано исклю­чение или EXCEPTION_CONTINUE_SEARCH (выпол­няет­ся сле­дующий век­торный обра­бот­чик, а если таких нет, то раз­ворачи­вает­ся SEH).


За­регис­три­руем обра­бот­чик и про­верим работу VEH. Исклю­чени­ем пока будет стан­дар­тный Null-Pointer Reference. То есть обра­щение к ука­зате­лю, который име­ет зна­чение nullptr.


#include <iostream>
#include <windows.h>
#include <errhandlingapi.h>
LONG WINAPI MyVectoredExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (AddVectoredExceptionHandler(1, MyVectoredExceptionHandler) == nullptr)
{
std::cout << "Failed to add the exception handler!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42; // Исключение возникает тут
return 0;
}
Об­работ­ка исклю­чения с помощью VEH

Ви­дим, что обра­бот­чик успешно сра­баты­вает и вызыва­ется, затем воз­вра­щает EXCEPTION_CONTINUE_SEARCH. Это, в свою оче­редь, дер­гает SEH, SEH в прог­рамме нет, поэто­му Visual Studio вклю­чает­ся и выда­ет нам исклю­чение. Если будем воз­вра­щать EXCEPTION_CONTINUE_EXECTION, то получим бес­конеч­ный вызов обра­бот­чика, так как каж­дый раз будет сра­баты­вать стро­ка *p = 42.


Бес­конеч­ная обра­бот­ка исклю­чения

Точ­но такое же исклю­чение будет сра­баты­вать и при хар­двер­ных бря­ках.


На­конец, пос­ледний тип обра­бот­чиков — Unhandled Exception Filter. Он ред­ко ког­да исполь­зует­ся, но изна­чаль­но задумы­вал­ся как обра­бот­чик для исклю­чений, которые вооб­ще ник­то не обра­баты­вает. Ни VEH (если отсутс­тву­ет или вер­нул EXCEPTION_CONTINUE_SEARCH), ни SEH (если тоже отсутс­тву­ет или ука­зано EXCEPTION_CONTINUE_SEARCH). Уста­нав­лива­ются такие обра­бот­чики через фун­кцию SetUnhandledExceptionFilter().


LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
[in] LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);

Фун­кция при­нима­ет один‑единс­твен­ный параметр — адрес фун­кции‑обра­бот­чика, которая дол­жна вызывать­ся при воз­никно­вении необ­работан­ного исклю­чения. С помощью UEF так­же ловят­ся исклю­чения, воз­ника­ющие при бря­ках.


Возь­мем прош­лый код и переде­лаем его под UEF.


#include <iostream>
#include <windows.h>
LONG WINAPI MyUnhandledExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Unhandled exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (SetUnhandledExceptionFilter(MyUnhandledExceptionHandler) == nullptr)
{
std::cout << "Failed to set the unhandled exception filter!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42;
return 0;
}

Об­рати вни­мание, что если ты запус­тишь этот код в Visual Studio, то она выдаст ошиб­ку до UEF.


Ис­клю­чение от «Сту­дии», а не от UEF

Это свя­зано с тем, что исклю­чение в дан­ном слу­чае обра­баты­вает Visual Studio. Если же файл будет запущен за пре­дела­ми IDE, то мы получим успешный вызов обра­бот­чика.


Вы­зов обра­бот­чика 

Установка hardware breakpoint



Перейти обратно к новости