我正在为课程编写回退跟踪程序。提供的启动程序代码在崩溃时为我们提供了%eip,我们应该打印运行时堆栈的回溯。
第一步似乎是要获取%ebp的顶级堆栈,并且我们的作业表明“在C代码中可以访问的东西相对于当前基址指针具有固定的位置”。
我唯一能想到的就是将函数的参数存储在%ebp之上的固定位置,但是我无法想到使用此信息的任何可能方式。
用仅C代码(无内联汇编或任何内容)查找此%ebp的方法是什么?
任何朝着正确方向的回应将不胜感激!我在x86-32位上。
最佳答案
我假设该任务适用于Linux / UNIX。
提供的入门代码会在崩溃时给我们%eip,
因此,您现在处于SIGSEGV处理程序中,并且从...获取了eip。...上下文-处理程序的第三个参数?
第一种方式:
信号处理程序在应用程序堆栈上启动;如果您将获取某个局部变量的地址,则将获得指向堆栈的指针:
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)并通过处理程序的第三个参数入侵它。