【问题标题】:Buffer Overflow check instruction on x86x86 上的缓冲区溢出检查指令
【发布时间】:2017-05-05 21:21:42
【问题描述】:

以下是为我正在反汇编的函数生成的第一个 3 条指令。 (Windows 7 上的 Visual C++ 2015,32 位应用程序。)

push    218h
mov     eax,offset MyModule!_log_pentium4+0x8cbf (53c0b577)
call    MyModule!_EH_prolog3_GS (53ad7977)

我不明白第二条指令。我的实际函数(以源代码形式)只有 5 行,并且没有在其中使用任何数学函数(这与 Google 搜索 _log_pentium4 相关。)eax 中的值也很可能用于随后调用缓冲区溢出安全检查例程。我很想知道。

【问题讨论】:

  • +0x8cbf 偏移量只是告诉您反汇编程序不知道正在传递什么。当然与“log_pentium”无关。我们也不知道。看起来这个函数调用设置了一个异常处理程序,它将使用一个不会出现在您的代码中的内部表。
  • 要扩展 Hans 的评论并解释 log_pentium4 的来源,请参阅 this blog entry。基本上,它是调试器在该近似位置的最后一个符号,因此它使用它并添加必要的偏移量。
  • @CodyGray Raymond 的博客文章为我做了这件事。谢谢!我被那个 _log_pentium 名字迷住了。也谢谢你,汉斯。
  • @HansPassant 另外,您是如何确定该函数正在根据该指令设置异常处理程序的?

标签: assembly visual-c++ x86


【解决方案1】:

MyModule!_log_pentium4+0x8cbf (53c0b577) - 这是指向所谓的范围表(EH*_SCOPETABLE_RECORD 的数组)的指针。

阅读更多信息,例如在这里 - Where is my exception handler code in the function disassembly? 或在这里 - reversing Microsoft Visual C++ Part I: Exception Handling

您也可以查看 msvc crt 文件夹 - \VC\crt\src\i386\chandler4.c 或类似(取决于 crt 版本)

typedef struct _EH4_SCOPETABLE_RECORD
{
    ULONG                       EnclosingLevel;
    PEXCEPTION_FILTER           FilterFunc;
    union
    {
        PEXCEPTION_HANDLER      HandlerAddress;
        PTERMINATION_HANDLER    FinallyFunc;
    } u;
} EH4_SCOPETABLE_RECORD, *PEH4_SCOPETABLE_RECORD;

在第二个链接中,这个结构被命名为_SCOPETABLE_ENTRY

【讨论】:

  • 所有这些当然只适用于 x86。 x64 有绝对不同的异常处理(根本不在堆栈中)
  • 博客文章内容丰富,我现在有了更好的理解。我仍然要问你上面问汉斯的问题。您如何确定它是指向异常处理范围表的指针?我的意思是,是什么泄露了它?
  • @ForeverLearning - 这是带有 c++ 异常处理 (try/catch) 的标准函数序言。 218h 这是为本地变量保留的空间,名称 _EH_prolog3_GS 是已知的。众所周知的是论点。
【解决方案2】:

它显然是使用 EAX 寄存器将参数值传递给函数。

【讨论】:

    猜你喜欢
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多