XOR EAX, 2(和加载/存储/指针增量)在哪里常用?
Posted
技术标签:
【中文标题】XOR EAX, 2(和加载/存储/指针增量)在哪里常用?【英文标题】:Where is XOR EAX, 2 (and load/store/pointer-increment) commonly used? 【发布时间】:2021-11-21 09:17:31 【问题描述】:我最近正在努力学习汇编。 我的一个朋友向我展示了以下说明:
mov EAX, [EDX]
xor EAX, 2
mov [EBX], EAX
inc EDX
inc EBX
我回复了,
1. Value at `edx` address is loaded in `eax`
2. Value in `eax` is XORed by 2
3. Value in `eax` is stored back in memory address mentioned in `ebx`
Increment edx and ebx.
我的解释正确吗?如果我错了,请纠正我。
其次他问,这个用的最多的是哪里?
这是某种常规的代码例程指令吗?谁能帮我看看这个在哪里用得最多?
请原谅我的理解/错误。我对组装很陌生。
【问题讨论】:
是的,你的解释是正确的。它可以用于某种简单的加密形式,将源缓冲区异或到目标。当然,您还需要一个循环。 请注意,这一次加载和存储 4 个字节。但是,inc
指令仅将两个指针分别递增 1,而不是 4。(eax
寄存器中的高 3 个字节不会被 xor
指令更改。)
@ecm - 是的,我也是这么想的。我们可以随机增加寄存器值吗?它不会产生无效的内存位置错误吗?
@v1h5:递增指针,然后在指针的新地址处访问内存可能是有效的操作,例如遍历大于 1 字节的缓冲区。但是,如果您在缓冲区末尾递增,则从该地址加载或存储到该地址也可能无效。例如,这些访问可以静默访问其他缓冲区或变量。或者,如果访问的是未映射的页面,它们可能会导致分段错误。
@ecm - 明白了。那么这个概念可能会导致缓冲区溢出。
【参考方案1】:
这看起来毫无意义的低效和奇怪(如果这是在一个循环中重叠的 4 字节加载/存储),所以我怀疑你会在任何地方找到它,但是是的,你已经正确地描述了它的作用。
复制缓冲区并仅翻转每个字节的第 2 位也是不正常的(假设 EDX 和 EBX 指向非重叠缓冲区)。
但是,如果您要这样做,您可以一次一个字节地加载 movzx eax, byte [edx]
和 mov [ebx], al
存储,或者您可以 add ebx,4
/add edx,4
这样您就可以 xor eax, 0x02020202
. (或者最好使用 SSE1 或 SSE2 一次复制和异或 16 个字节。)
使用更复杂的 XOR 常量,这可用于对字符串或其他数据进行轻微混淆,这些数据来自简单的低工作量逆向工程,例如 strings ./a.out
,以在可执行文件中查找连续的 ASCII 字节。
查看例如glibc memfrob(3)
与42
(0x2a
) 进行异或,就地而不是复制。从没有设置高位的常量可以看出(所以大多数可打印的 ASCII 字符保持可打印的 ASCII),这个函数至少是半个笑话。人们仍然会找到你的字符串,只是它们不是立即可读的。
【讨论】:
这是一个很好的解释(尽管对于像我这样的初学者来说有点高水平。我正在努力掌握 :D )但我很高兴我最初的理解是正确的。谢谢你的解释。以上是关于XOR EAX, 2(和加载/存储/指针增量)在哪里常用?的主要内容,如果未能解决你的问题,请参考以下文章