c - 汇编mov指令输出
问题描述
我想了解我的数据字符串如何在 rdx 中结束。在我看来, mov 指令将在地址找到的数据放入目标中。所以来自 rbp-0x28 的内容被放入 rdx。我检查了 rbp-0x28 中的内容,它不是数据字符串('AAAAAAA')。但是,如果我让命令使用 ni 执行,则 rdx 包含该字符串。我不知道字符串是如何在 rdx 中结束的,因为它事先不包含在 rbp-0x28 中。我知道我的数据包含在 0x7ffffffffe58f 中,但我不确定它是如何或何时加载到 rdx 中的。任何帮助是极大的赞赏!
解决方案
这在很大程度上取决于您使用的编译器或调试器以及架构和调用约定。我确实使用 Apple 的 Clang 编译器和 lldb 运行了您的代码,并得到了预期的结果。我的输出和您的输出之间存在细微差别,但相对容易理解。由于您仅在偏移量 + 0x12 处发布了函数调试的部分输出,因此我假设之前哪个寄存器寄存器保存了函数调用的第一个参数(在我的情况下为 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'接下来我读取了寄存器rbp并打印rbp = 0x00007ffeefbff740
然后我读取了0x0x00007ffeefbff740-0x30的内存地址(在你的情况下它是-0x28),它是0x0x7ffeefbff710,这里是相同的地址存储在 rsi
0x7ffeefbff94a(小端)中。我们知道指向字符串 'AAAAAAA' 所以我假设你在 RBP-0x28 所期望的是字符串本身。它应该是包含指向字符串的指针的地址。还要确保正确地进行偏移。跟着这些步骤:
lea rax 处的断点,[rbp-0x20]
检查 rdx 的值,查看该地址的内存,它应该给你字符串。
然后检查rbp的值。从中减去 0x28。查看偏移处的内存。
这应该为您提供 rdx 的值。这又应该指向您要查找的字符串。
推荐阅读
- c# - 无法观看 Dictionary 的 linq 扩展方法
在统一 - reactjs - 如何检查路由是否处于活动状态?
- synchronization - GlusterFS 复制卷的数据同步被 remove-brick 中止
- java - 无法使用 v6.18+ 构建 JXBrowser jar
- javascript - 在 Javascript 中进行基本年龄检查时遇到问题
- typescript - 如何声明 TypeScript 接口,其中属性名称是数组中的值
- javascript - 在javascript中返回匹配字符串的数组
- django - 使用 Count 进行注释会使用 NullBooleanField 产生不正确的值
- java - 如何使用 Java 通过 HmacSHA256 加密 Json
- javascript - 使用 request-promise 获取 github url 返回 404