好的,所以基本上我想知道如何打印与GDB寄存器中存储的地址偏移的内存地址的值。例如,采用这个装配线:
mov 0x34(%esp),%edx
根据我的理解,它在堆栈指针指向的地址之后取值52个字节,并将该值存储在edx寄存器中。在这种情况下,值是一个字符串,因此它将存储char *。在edx寄存器中使用GDB内部的examine命令时:
x/s $edx
它按照预期打印出字符串。但是,当我尝试通过直接检查使用此命令复制的位置打印出字符串时:
x/s $esp + 0x34
打印出垃圾。为什么是这样?我误解了GDB命令的语法,还是其他的东西?
答案 0 :(得分:8)
x
命令打印出指定寄存器指向的地址的数据。例如,x/s $edx
打印从edx
寄存器的值定义的地址开始的字符串。它还应该打印地址本身。
我们假设esp
的值为0x7fffff00
,从0x34(%esp)
加载到edx
的值为0x43210
。
x/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)
有效