12

好的,所以基本上我想知道如何打印与存储在 GDB 中的寄存器中的地址偏移的内存地址的值。例如,以这条装配线为例:

mov 0x34(%esp),%edx

在我的理解中,这会在堆栈指针指向的地址之后获取 52 个字节的值,并将该值存储在 edx 寄存器中。在这种情况下,该值是一个字符串,因此它将存储一个 char *。在 edx 寄存器上使用 GDB 内部的检查命令时:

x/s $edx

它按预期打印出字符串。但是,当我尝试通过直接检查使用此命令复制的位置来打印字符串时:

x/s $esp + 0x34

它打印出垃圾。为什么是这样?我是否误解了 GDB 命令的语法,还是其他原因?

4

2 回答 2

10

x命令打印出指定寄存器指向的地址处的数据。例如x/s $edx打印从edx寄存器值定义的地址开始的字符串。它还应该打印地址本身。

让我们假设espis的值和从to0x7fffff00加载的值is 。 将以类似于以下方式在位置打印字符串:0x34(%esp)edx0x43210x/s $edx0x43210

(gdb) x/s $esp
0x0x43210:   "hello world!"

虽然x/s $esp + 0x34实际上会尝试打印从0x7fffff34. 那里有指向实际字符串的指针,所以如果你这样做x/wx $esp + 0x34了,你应该看到指向你的字符串的指针(0x43210)。您看到的“垃圾”是表示为字符串的指针(和后续数据)。

于 2013-10-24T07:11:06.000 回答
1
x/s *(void**)($esp + 0x34)

作品

于 2019-05-19T16:51:00.663 回答