一段构造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] 即可。

 

 

posted @ 2020-03-25 09:05  OneTrainee  阅读(337)  评论(0编辑  收藏  举报