我是靠谱客的博主 殷勤老虎,最近开发中收集的这篇文章主要介绍在栈溢出和堆溢出中利用SEH1.TEB2.windows异常处理机制(S.E.H) 3.在栈溢出中利用S.E.H4.堆溢出中利用S.E.H,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文总结自《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。

 

最后

以上就是殷勤老虎为你收集整理的在栈溢出和堆溢出中利用SEH1.TEB2.windows异常处理机制(S.E.H) 3.在栈溢出中利用S.E.H4.堆溢出中利用S.E.H的全部内容,希望文章能够帮你解决在栈溢出和堆溢出中利用SEH1.TEB2.windows异常处理机制(S.E.H) 3.在栈溢出中利用S.E.H4.堆溢出中利用S.E.H所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部