相对于寄存器的GDB打印值

时间:2013-10-24 01:22:58

标签: c memory assembly x86 gdb

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

mov 0x34(%esp),%edx

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

x/s $edx

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

x/s $esp + 0x34

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

2 个答案:

答案 0 :(得分:8)

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

我们假设esp的值为0x7fffff00,从0x34(%esp)加载到edx的值为0x43210x/s $edx将以类似于此的方式在位置0x43210打印字符串:

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

虽然x/s $esp + 0x34实际上会尝试打印从0x7fffff34开始的字符串。那里有指向实际字符串的指针,因此如果你执行x/wx $esp + 0x34,你应该会看到指向字符串的指针(0x43210)。你看到的“垃圾”是这个指针(和后面的数据)表示为字符串。

答案 1 :(得分:0)

x/s *(void**)($esp + 0x34)

有效