相对于寄存器的GDB打印值

Chr*_*etz 9 c memory x86 assembly gdb

好吧,所以基本上我想知道如何打印一个存储器地址的值,该地址与存储在GDB寄存器中的地址相差一点.例如,拿这个装配线:

mov 0x34(%esp),%edx
Run Code Online (Sandbox Code Playgroud)

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

x/s $edx
Run Code Online (Sandbox Code Playgroud)

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

x/s $esp + 0x34
Run Code Online (Sandbox Code Playgroud)

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

dbr*_*nk0 8

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

让我们假设的价值esp就是0x7fffff00和值从加载0x34(%esp)edx0x43210. x/s $edx将以0x43210类似于这样的方式在位置打印字符串:

(gdb) x/s $esp
0x0x43210:   "hello world!"
Run Code Online (Sandbox Code Playgroud)

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