【发布时间】:2018-07-30 20:16:14
【问题描述】:
我一直在关注this tutorial,但我被卡住了。他大约在 6:30 开始解释。
所以在那一集中有一个 for 循环,看起来像 this。正如他所说,我在解释过程中迷路了。但是我重看了几遍,有一点我不明白。所以这是代码,我在看寄存器时做了一些笔记。mov rax, [rbp+arg]
所以在这条线 rax = 0x7ffe63c2d498 和 arg = 0x7ffe63c2d380 之后。我解码了这两个,但什么也没出现,所以我假设它们是指针。add rax, 8mov rdx, [rax]
在此行 rdx = 0x7ffe63c2e09d 之后。我假设这又是一个指针。mov eax, [rbp+i]
这会移动 eax 中 i 的值,例如 0x01cdqeadd rax, rdx
在这里,您将 i 的值添加到字符串的指针中。movzx eax, byte ptr [rax]
在这里,您将 rax 指向的字符移动到 eax。movsx eax, aladd [rbp+sum], eaxadd [rbp+i], 1
在这里你总结和i++。
我的问题是:[] 不应该将地址指向的值移动到寄存器中吗?因此,它将 arg 指向的值移动到 rax 中,然后将 rax 指向的值移动到 rdx 中。但这两个都是指针。怎么会?那么arg是指向指针的指针吗?
【问题讨论】:
-
是的,您可以清楚地看到并且也应该知道,
argv的类型为char*[],编译器决定将其复制到再次通过指针访问的堆栈中。 -
汇编程序没有
C所具有的数据类型。汇编程序中没有指针。只有寄存器和立即操作数。该指令规定了该指令如何解释寄存器或立即数的值。 -
啊,所以 arg 是指向 argv 数组的指针?然后将 char* argv[1] 指针复制到 rdx 中?然后它搜索到 char* 的索引并获取字符?
-
@bolov 但您仍然可以将它们视为指针吗?它们指向一个使用 []? 访问的值
-
arg是相对于rbp的偏移量,它访问堆栈上的argv的副本。
标签: assembly x86-64 reverse-engineering