崩溃后找到%ebp(有%eip)

时间:2012-08-07 20:21:25

标签: c x86

我正在为课程编写崩溃跟踪程序。提供的入门代码在崩溃时给出了%eip,我们应该打印运行时堆栈的回溯。

第一步似乎是获得顶层堆栈的%ebp,我们的任务表明“在C代码中可以访问某些内容相对于当前基本指针具有保证的固定位置”。

我唯一能想到的是函数存储在%ebp之上的固定位置的参数,但我想不出任何可能的方法来使用这些信息。

有什么方法可以用C代码找到这个%ebp(没有内联汇编或任何东西)?

任何朝着正确方向的人都会非常感激!我在x86-32位。

2 个答案:

答案 0 :(得分:1)

我假设该任务是针对Linux / UNIX的。

  

提供的入门代码可让我们在崩溃时获得%eip,

那么,你现在在SIGSEGV处理程序中并且从.... context中获取 - 处理程序的第三个参数?

第一种方式:

信号处理程序在应用程序堆栈上启动;如果您将获取某个局部变量的地址,您将获得指向堆栈的指针:

 void sigsegv_handler(int signo, siginfo_t *info, void *context)
 {
   int a;
   void * ptr = &a;
   void * ptr_epb = ptr+0x**; 
   // 0x** is an unknown offset, find in disassembly or in debugger
 }

如果我们在谈论一般情况(根据C编程语言标准和/或某些UNIX规范,这应该是未定义的行为),这通常不是“保证相对于当前基指针的固定位置”。但对于x86 / x86_64;一些固定编译器;固定的编译器选项集;启用帧指针保存在堆栈中,然后此偏移量将保持不变。

第二种方式:

检查ucontext.h(/ usr / include / sys)并通过处理程序的第三个参数入侵它。

答案 1 :(得分:1)

在GCC中,使用__builtin_frame_address(level)。见this page。任何通过标准C结构找到%ebp的尝试都可能是一个无法保证工作的黑客。

相关问题