在栈溢出和堆溢出中利用SEH

本文总结自《0day安全:软件漏洞分析技术》

1.TEB

该部分参考自https://bbs.pediy.com/thread-223816.htm 作者:AperOdry 

ntdll.NtCurrentTeb()函数返回当前线程的TEB结构体指针。

 

fs:[0x18]处存放当前线程TEB结构体指针,值009BF00,即fs:[0x0]是TEB的起始地址。

此处介绍第一个结构体成员NtTib(线程信息块)

typedef struct _NT_TIB          //sizeof  1ch  
{  
 00h   struct _EXCEPTION_REGISTRATION_RECORD  *ExceptionList; 
 04h   PVOID                            StackBase;
 08h   PVOID                            StackLimit;
 0ch   PVOID                            SubSystemTib;  
       union {  
           PVOID                FiberData;  
 10h       DWORD                Version;  
       };  
 14h   PVOID                            ArbitraryUserPointer;  
 18h   struct _NT_TIB                   *Self; 
}NT_TIB;  
ExceptionList:即为指向_EXCEPTION_REGISTRATION_RECORD结构体的链表指针(SEH)

2.windows异常处理机制(S.E.H) 

S.E.H异常处理结构体,包含两个DWORD指针。

  1. S.E.H结构体存放在系统栈中
  2. 线程初始化时会在栈中安装一个S.E.H,程序中使用了__try{}__except{}等异常处理机制,向当前函数栈帧中安装一个S.E.H。
  3. 当异常发生时,操作系统会中断程序,并首先从TEB的0字节偏移处取出距离栈顶最近的SEH,使用异常处理函数句柄所指向的代码来处理异常。

3.在栈溢出中利用S.E.H

buf的起始位置为0x12FE94

在View->SEH chain,查看SEH链。离栈顶最近的SEH位于0x12FF68,0x12FF68指向下一个SEH的链表指针,0x12FF6C存储异常处理函数句柄。我们需要将异常处理函数句柄利用栈溢出覆盖成shellcode的起始地址。

 利用一个除0异常,调用离栈顶最近的异常处理函数,0x12FF6C,即可跳转到shellcode起始地址,执行shellcode。

4.堆溢出中利用S.E.H

原理:利用堆溢出,将下一空闲堆块的空表指针覆盖为shellcode起始地址和SHE异常回调函数地址,从而将SHE的异常回调函数地址替换为shellcode的起始地址。

同样是在程序开始处写int 断点,运行后OD捕捉异常自动附加。

运行到HeapAlloc结束,程序产生异常,查看SEH链,第一个SEH位于0x12FF30,其异常回调函数地址应为0x12FF34。

 将下一空闲堆块的空表指针修改为shellcode起始地址和0x12FF34。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值