我正在为课程编写崩溃跟踪程序。提供的入门代码在崩溃时给出了%eip,我们应该打印运行时堆栈的回溯。
第一步似乎是获得顶层堆栈的%ebp,我们的任务表明“在C代码中可以访问某些内容相对于当前基本指针具有保证的固定位置”。
我唯一能想到的是函数存储在%ebp之上的固定位置的参数,但我想不出任何可能的方法来使用这些信息。
有什么方法可以用C代码找到这个%ebp(没有内联汇编或任何东西)?
任何朝着正确方向的人都会非常感激!我在x86-32位。
答案 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的尝试都可能是一个无法保证工作的黑客。