
1) 【一句话结论】Windows内核的SEH机制通过异常记录和链表捕获程序异常,攻击者可利用漏洞劫持异常处理流程实现提权,360通过内核补丁检测(监控SEH链表非法修改)和行为监控(分析异常处理程序行为)防御此类攻击。
2) 【原理/概念讲解】SEH是Windows内核的异常处理机制,用于捕获程序运行中的异常(如访问非法内存、除零错误)。核心组件包括:
struct _EXCEPTION_RECORD {
DWORD ExceptionCode; // 异常类型编码(如0xC0000005表示访问非法内存)
PVOID ExceptionAddress; // 异常发生地址
DWORD NumberParameters; // 参数数量
DWORD ExceptionFlags; // 标志位
PVOID ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; // 参数
PEXCEPTION_RECORD NextExceptionRecord; // 指向下一个记录的指针
}
每个异常记录包含异常类型、发生地址、处理程序地址等关键信息。当异常发生时,内核会遍历异常处理链表:
类比:异常处理就像“异常的快递处理流程”——异常记录是“异常的包裹信息(含异常类型、地址)”,异常处理程序是“负责处理异常的快递员(代码)”,异常处理链表是“快递员的工作链(按优先级排列,先找最近的快递员处理)”。例如,程序访问非法内存时,内核触发异常,将异常信息填入记录,遍历链表找到第一个能处理的快递员(处理程序),执行其代码;若链表为空则程序崩溃。
3) 【对比与适用场景】
| 对比项 | SEH提权攻击 | 360防御手段 |
|---|---|---|
| 定义 | 利用堆栈溢出等漏洞,覆盖异常处理链表指针,劫持异常处理流程,跳转到恶意代码实现提权 | 通过内核补丁检测(监控SEH链表是否被非法修改)和行为监控(检测异常处理程序是否执行提权系统调用)防御攻击 |
| 工作原理 | 堆栈溢出覆盖SEH指针(位于栈中),修改为恶意代码地址;异常发生时,内核遍历链表,跳转到恶意代码 | 内核驱动实时监控异常处理链表指针变化,对比正常状态;行为分析模块检测异常处理程序是否调用系统调用(如NtCreateProcess、NtSetInformationProcess) |
| 使用场景 | 漏洞利用(如堆栈溢出、缓冲区溢出、格式化字符串漏洞) | 防御漏洞利用,保护系统安全,防止提权 |
| 注意点 | 需精确覆盖SEH指针,避免破坏栈结构;需触发异常(如访问非法内存)使内核进入异常处理流程 | 需实时监控,避免误报(如合法的异常处理程序,如调试器);需结合行为分析,提高检测准确率 |
4) 【示例】
伪代码展示SEH提权攻击:
void vulnerable_function() {
char buffer[8];
strcpy(buffer, "a" * 12); // 堆栈溢出,覆盖SEH指针
}
int main() {
// 假设SEH指针在栈中,地址为0x7ffdf000(x86下,偏移-8相对于EBP)
// 溢出后,SEH指针被覆盖为恶意代码地址0xdeadbeef
vulnerable_function();
// 异常发生时,内核遍历链表,跳转到0xdeadbeef的shellcode
// shellcode执行系统调用(如NtCreateProcess),提升权限
}
解释:当vulnerable_function执行strcpy时,输入字符串长度超过8,覆盖栈中的SEH指针,将其指向恶意代码。当后续发生异常(如访问非法内存),内核触发异常,跳转到恶意代码,执行提权操作(如创建系统进程、修改进程权限),实现提权。
5) 【面试口播版答案】
“SEH是Windows内核的异常处理机制,核心是通过异常记录和链表来捕获程序运行中的异常。攻击者可以利用堆栈溢出等漏洞,覆盖异常处理链表指针,劫持异常处理流程,跳转到恶意代码实现提权。360通过内核补丁检测,实时监控异常处理链表是否被非法修改;通过行为监控,检测异常处理程序是否执行系统调用(如创建进程、提权),从而有效防御这类攻击。”
6) 【追问清单】
7) 【常见坑/雷区】