【问题标题】:GDB Print Value Relative to RegisterGDB 打印值相对于寄存器
【发布时间】:2013-11-02 12:43:33
【问题描述】:

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

mov 0x34(%esp),%edx

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

x/s $edx

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

x/s $esp + 0x34

它打印出垃圾。为什么是这样?我是不是对 GDB 命令的语法有误解,还是有别的意思?

【问题讨论】:

  • 你的字符串长度是多少/

标签: c memory assembly x86 gdb


【解决方案1】:

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)。你看到的“垃圾”就是这个指针(和后面的数据)表示为字符串。

【讨论】:

    【解决方案2】:
    x/s *(void**)($esp + 0x34)
    

    作品

    【讨论】:

    • 或者,只是p *(char**)($esp + 0x34)
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多