一段构造SEH异常来调用恶意代码的片段分析
一段构造SEH异常来调用恶意代码的片段分析
众所周知,FS三环下指向TEB,TEB+0x0处为_NT_TIB,其详细结构如下:
nt!_TEB
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle : Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
nt!_NT_TIB
+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 StackBase : Ptr32 Void
+0x008 StackLimit : Ptr32 Void
+0x00c SubSystemTib : Ptr32 Void
+0x010 FiberData : Ptr32 Void
+0x010 Version : Uint4B
+0x014 ArbitraryUserPointer : Ptr32 Void
+0x018 Self : Ptr32 _NT_TIB
nt!_EXCEPTION_REGISTRATION_RECORD
+0x000 Next : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 Handler : Ptr32 _EXCEPTION_DISPOSITION
因此数据结构如下图:
下面来分析其汇编代码:
1. 向SEH链中添加代码:
push 恶意代码
push large dword fs:0
mov fs:0,esp
其借助栈来构造ExceptionList
xor ecx,ecx
div ecx
其会首先触发SEH异常,然后操作系统找寻SEH链,找到第一个handler(替换为恶意代码并执行)
2.将ExceptionList还原的:
mov eax,large fs:0 // 获取Esp
mov eax,[eax] // 获取ExceptionList
mov eax,[eax] // 获取Next
mov large fs:0 eax; // 还原fs:0
该代码有个明显的错误,其将第一个ExceptionHandler也从链表中摘除,正常只有一个 mov eax,[eax] 即可。