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(和加载/存储/指针增量)在哪里常用?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别