概述
本文总结自《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指针。
- S.E.H结构体存放在系统栈中
- 线程初始化时会在栈中安装一个S.E.H,程序中使用了__try{}__except{}等异常处理机制,向当前函数栈帧中安装一个S.E.H。
- 当异常发生时,操作系统会中断程序,并首先从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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复