gpt4 book ai didi

c - 崩溃后查找%ebp(有%eip)

转载 作者:行者123 更新时间:2023-11-30 14:24:23 24 4
gpt4 key购买 nike

我正在为一门类(class)编写一个崩溃回溯程序。提供的起始代码在崩溃时为我们提供 %eip,并且我们应该打印运行时堆栈的回溯。

第一步似乎是获取顶部堆栈的 %ebp,我们的作业表示“C 代码中存在可访问的内容,该内容相对于当前基指针具有保证的固定位置”。

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

仅使用 C 代码(无需内联汇编或任何其他内容)即可找到此 %ebp 的方法是什么?

任何正确方向的思考都将不胜感激!我使用的是 x86-32 位。

最佳答案

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

The provided starter code gives us %eip upon a crash,

那么,您现在位于 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) 并通过处理程序的第三个参数侵入它。

关于c - 崩溃后查找%ebp(有%eip),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com