通过SEH链绕过GS保护机制
⑴. 原理分析:
i.异常处理结构(SEH)处理流程如下:
SEH是基于线程的,每一个线程都有一个独立的SEH处理结果,在线程信息块中的第一个结构指向线程的异常列表,Fs:[0]总是指向当前线程的TIB,其中0偏移的指向线程的异常链表,即ExceptionList是指向异常处理链表(EXCEPTION_REGISTRATION结构)的一个指针。
线程信息块定义:
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; //异常的链表
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union {
PVOID FiberData;
DWORD Version;
};
PVOID ArbitraryUserPointer;
struct _NT_TIB *Self;
} NT_TIB;
EXCEPTION_REGISTRATION结构:
typedef struct _EXCEPTION_REGISTRATION_RECORD {
//指向前一个EXCEPTION_REGISTRATION的指针
struct _EXCEPTION_REGISTRATION_RECORD *Prev;
PEXCEPTION_ROUTINE Handler; //当前异常处理回调函数的地址
} EXCEPTION_REGISTRATION_RECORD;
异常处理函数(EXCEPTION_REGISTRATION结构中的PEXCEPTION_ROUTINE Handler),原型:
EXCEPTION_DISPOSITION __cdecl _except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,//指向包含异常信息的EXCEPTION_RECORD结构
void* EstablisherFrame,//指向该异常相关的EXCEPTION_REGISTRATION结构
struct _CONTEXT *ContextRecord,//指向线程环境CONTEXT结构的指针
void* DispatcherContext){ //该域暂无意义
……
//4种返回值及含义
//1.ExceptionContinueExecution(0):回调函数处理了异常,可以从异常发生的指令处重新执行。
//2.ExceptionContinueSearch(1):回调函数不能处理该异常,需要要SEH链中的其他回调函数处理。
//3.ExceptionNestedException(2