SEH

When SEH is used there is a registration process where an exception structure is
created for every function as a local variable. The last field of the structure overlaps the
location where frame pointer EBP points. Function‘s prologue creates this structure on
its stack frame and registers it with the operating system at runtime. The significance of
this is that the pointer to the exception handler and the pointer to the Next exception
handler are both stored on the stack in the program function’s local variables section of
its stack frame.

参考:http://rogunix.com/docs/Reversing&Exploiting/Understanding%20SEH%20Exploitation.pdf

SEH Record会作为局部变量存放在栈中,或者说它与局部变量在栈中相邻存放,先存放SEH Record,再存放局部变量。

When an exception occurs in a program function, the system exception dispatcher
routine runs and sets up its own stack frame.While doing so, it will push elements of
this Exception Handler structure onto the stack since this is part of a function prologue to
execute the exception code. Keep in mind that this is a separate stack used for the
exception dispatcher and not directly related to the program stack that we overwrote with
the buffer.

当异常发生时,SEH的Handler并不会在当前程序的栈环境中执行,而是会使用独立的栈,在这个栈中,esp+8的位置上保存着指向SEH Record的指针,所以这就是为什么需要

PPR(pop;pop;ret)的原因了。

SEH

时间: 2024-10-23 20:04:30

SEH的相关文章

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的

简单的SEH处理

#include "stdafx.h" #include "stdlib.h" #include <windows.h> #include <EXCPT.h> #include <tchar.h> int main(int argc, char* argv[]) { BYTE shellcode[12]="\x66\xB8\x01\x20\x66\xBA\x04\x10\x66\xEF\xC3"; for (i

使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数

如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函数只能有一份这样的东东(“代码和信息”),故一个函数只能采用一种形式的异常处理规则. 上图中黄色部分就是新添加的异常信息,通过stack unwinding来实现局部变量的析构函数自动调用.所以在析构函数中不能抛出异常(http://publib.boulder.ibm.com/infocenter

Windows内核读书笔记——SEH结构化异常处理

SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中. SEH提供了终结处理和异常处理两种功能. 终结处理保证终结处理块中的程序一定会被执行 1 __try 2 { 3 //要保护的代码 4 } 5 __finally 6 { 7 //终结处理块 8 } 退出保护块的方式:正常结束和非正常结束两种 1.正常结束 正常执行并顺序进入终结处理块称为正常结束 2.非正常结束 因为发生异常或是因为return.goto.break.continue等流程控制语句而离开被

第25章 SEH结构化异常处理_未处理异常及向量化异常

25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID lpfnEntryPoint) //参数为线程函数的入口地址 { DWORD retValue; DWORD currentESP; DWORD exceptionCode; currentESP = ESP; //lpfnEntryPoint被try/except封装着,这是系统安装的默认的异常

第23章 SEH结构化异常处理(2)

23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTION_REGISTRATION结构 struct VC_EXCEPTION_REGISTRATION { VC_EXCEPTION_REGISTRATION* prev; //前一个结构体的指针 FARPROC handler; //永远指向_exception_handler4回调函数 scopet

关于SEH(结构化异常处理)的一些知识

梳理老罗win32汇编关于SEH一章的知识. 异常处理方式有两种: 筛选器异常处理和结构化异常处理,筛选器是全局性的,无法为一个线程或一个子程序单独设置一个异常处理回调函数,而结构化异常处理(Structured Exception Handing)SEH提供了每个线程之间独立的异常处理方法. 以下以两个例子来学习SEH 例子1:不含栈展开操作的异常处理(栈展开会在例子二中介绍) .386 .model flat,stdcall option casemap:none ;>>>>&

OD: GS Bypasing via SEH

通过 SEH 绕过 GS 保护 GS 机制没对 SEH 提供保护,所以可心通过攻击异常来绕过 GS. 实验环境为: VMware : Windows 2000 sp4, 此版本无 SafeSEH 的影响 Visual Studio 2005 Project Properties : Release, Disable Optimization 代码如下: 1 #include <string.h> 2 char shellcode[]= 3 "\xFC\x68\x6A\x0A\x38\

结构化异常(SEH)简述

/********************************************************************* * Author  : Samson * Date    : 08/04/2014 * Test platform: *              Linux ubuntu 3.2.0-58-generic-pae *              GNU bash, version 4.2.39 * *****************************

vc++6对windows SEH扩展分析 一文拾遗

前一篇文章vc++6对windows SEH扩展分析 尚有遗漏,本篇加以补齐. 其实本文参考csdn上一篇名为<Win32结构化异常处理(SEH)--异常处理程序(__try/except)>,同时提出了一些质疑. 作者罗列了vc++6.0扩展的SEH节点的结构如下: struct _EXCEPTION_REGISTRATION { struct _EXCEPTION_REGISTRATION *prev; void (*handler)(PEXCEPTION_RECORD, PEXCEPTI