【问题标题】:MOV instruction modify pointerMOV指令修改指针
【发布时间】:2020-07-31 11:44:34
【问题描述】:

我是 asm 的新手,我问自己这些(简单)问题: 如果我在esp 中有一个数组,我会这样写:

mov ebx,[esp + 0x10]
mov edx,[esp + 0x10]

edx 的值是否与ebx 相同?

关于lea(我看到那里有很多主题所以只是检查我是否理解正确^^),如果我理解了:

lea ebx, [esp + 0x8c]
and ebx, 0x4

and 影响ebx 的地址或它指向的值?

如果我这样做了,我的最后一个问题(仍然是关于 lea):

lea edx, [esp, 0x10]
movzx ecx, [edx-0x5]

mov 从地址中减去 5,还是从 edx 指向的值中减去 5?

【问题讨论】:

  • 至于第一:并非总是如此。该值可以随时写入。
  • Re“ebx的地址”,寄存器没有地址。您的意思是“地址 in ebx”吗?
  • 抱歉回复晚了。是的,这就是我的意思^^ @prl

标签: assembly x86


【解决方案1】:

edx 是否与 ebx 具有相同的值?

是的,因为您将相同的值移动到 edxebx

and影响ebx的地址还是它指向的值?

and 将对地址 esp + 0x8c 应用 AND 操作。

mov 是从地址中减去 5,还是从 edx 指向的值中减去 5?

寻址模式将edx 中的数字减去5,创建一个地址。此位置的字节或 2 字节内存块是 movzx 的源操作数,它加载并零扩展它。 (您忘记指定源操作数大小,因此实际上不会汇编。)

mov 只是复制数据而不改变它;您可以将地址数学视为首先发生;寻址模式对所有指令都一样。 (使用 LEA 作为不取消引用地址的特殊情况。)

以最后一个问题为例:

uintptr_t edx = 0x10 + (uintptr_t)esp;
uint32_t ecx = *(uint8_t*)(edx-0x5);

或作为 C 代码:

char* someChars=malloc(32);
//Fill someChars

uint8_t* edx = &someChars[0x10];
uint32_t ecx = edx[-5];       // ==someChars[11]

【讨论】:

  • @dl11:这个答案中的 C 示例有一些我认为我已经修复的错误。最重要的是,它们没有取消对计算指针的引用,因此等效的 asm 将是两条 LEA 指令,而不是 LEA + MOVZX。而且,在 ISO C 中,您不能从 void* 中添加/减去。我假设movzx ecx, byte [edx-0x5] 所以我可以使用uint8_t* 而不是uintptr_t 来解决按类型大小缩放指针数学的C。 (asm 没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多