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命令的语法,还是其他的东西?
x命令打印出指定寄存器指向的地址的数据.例如,x/s $edx打印从edxregister 的值定义的地址开始的字符串.它还应该打印地址本身.
让我们假设的价值esp就是0x7fffff00和值从加载0x34(%esp)到edx的0x43210.
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)的指针.你看到的"垃圾"是这个指针(和后面的数据)表示为字符串.