汇编mov指令输出

Assembly mov instruction output

我想了解我的数据字符串如何在 rdx 中结束。在我看来, mov 指令将在地址处找到的数据放入目标中。所以rbp-0x28的内容被放入rdx。我检查了 rbp-0x28 中的内容,它不是数据字符串 ('AAAAAAA')。但是,如果我让命令与 ni 一起执行,则 rdx 包含该字符串。我不知道字符串是如何在 rdx 中结束的,因为它事先没有包含在 rbp-0x28 中。我知道我的数据包含在 0x7fffffffe58f 中,但我不确定它是如何或何时加载到 rdx 中的。非常感谢任何帮助!

这在很大程度上取决于您使用的编译器或调试器以及体系结构和调用约定。我使用 Apple 的 Clang 编译器和 lldb 编写了 运行 您的代码,并获得了预期的结果。我的输出和您的输出之间存在细微差异,但相对容易理解。由于您只在 offset+0x12 处发布了函数 debug 的部分输出,因此我假设无论哪个寄存器寄存器保存了函数调用的第一个参数(在我的例子中是 RDI),都将指针移到了 [rbp-0x28] 这是我的输出。 mov rsi, qword ptr[rbp-0x30] 等同于你的 mov rdx,[rbp-0x28] 我认为你在微软的 x64 ABI 调用约定下,所以你的第一个参数是通过 rcx 传递的。但是在该指令之前它是 mov [rbp-0x30], rdi 我相信你的情况将是 mov [rbp-0x28],rcx

在下一条指令中mov rdi,rcx我又下了断点。在这里,我阅读了 rsi 的内容,在您的情况下是 rdx。它打印了 rsi = 0x00007ffeefbff94a 在那个特定的内存地址,我得到了结果 'AAAAAAA' Next I read the register rbp and printed rbp = 0x00007ffeefbff740 Then I read the memory address of 0x0x00007ffeefbff740-0x30 (in your case it would be -0x28) which is 0x0x7ffeefbff710 and here it was the same address stored in rsi 0x7ffeefbff94a(小端)。我们知道它指向字符串 'AAAAAAA' 所以我假设你在 RBP-0x28 中期望的是字符串本身。它应该是保存指向字符串的指针的地址。还要确保正确进行偏移。请按照以下步骤操作:

lea rax 处的断点,[rbp-0x20]

检查 rdx 的值,查看该地址的内存,它应该给你字符串。

然后检查rbp的值。从中减去 0x28。查看偏移量处的内存。

这应该会给你 rdx 的值。它应该依次指向您要查找的字符串。