gdb可以伪造帧寄存器吗?

时间:2020-07-02 13:51:00

标签: c x86 gdb

我正在分析应用程序的核心转储,当我转到第1帧时,我打印存储在EAX中的变量的值。 Gdb打印值,如果为true,则程序不会调用panic(反汇编显示,它会比较寄存器中的值,因此没有其他线程可以更改它)。我调用了info reg,并且指令指针的一部分在帧#0和#1上给了我相同的结果。 在第1帧中,Gdb是否有可能显示第0帧的EAX寄存器值?

编辑: 代码如下所示:

switch(myVar){
    case -1:
        break;
    default:
        panic();
}

gdb显示:

(gdb) bt
#0 panic()
#1 0x0891a3e9 in myFunc() at myFunc.c:10
(gdb) up
#1 0x0891a3e9 in myFunc() at myFunc.c:10
10    panic();
(gdb) print myVar
$1 = -1
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax

1 个答案:

答案 0 :(得分:5)

是否有可能在第1帧时Gdb显示第0帧的EAX寄存器的值?

不仅可能,而且目前

除了$EBP$ESP$EIP(有时是$EBX)以外,在调用堆栈中上移/下移时,GDB不会恢复寄存器。

可以说这是令人困惑的(在帧之间导航时,您看不到未还原的寄存器的实际值)。

GDB一直以来都是这样,并且在汇编级进行调试的人员都知道如何从堆栈中“获取”正确的值。

相关问题