与自己对寄存器进行异或的目的是什么?

dev*_*ium 112 x86 assembly

xor eax, eax将永远设置eax为零,对吗?那么,为什么MSVC++有时会把它放在我的可执行代码中呢?这样效率更高mov eax, 0吗?

012B1002  in          al,dx 
012B1003  push        ecx  
    int i = 5;
012B1004  mov         dword ptr [i],5 
    return 0;
012B100B  xor         eax,eax 
Run Code Online (Sandbox Code Playgroud)

另外,这意味着什么in al, dx

Gun*_*iez 140

是的,效率更高.

操作码短于mov eax, 02个字节,并且处理器识别特殊情况并将其视为mov eax, 0没有错误读取依赖性eax,因此执行时间相同.

  • "处理器对特殊情况进行了重新定位并将其视为"mov eax,0"而没有对eax的错误读取依赖性,因此执行时间是相同的"处理器实际上做得更好:它只是在内部执行寄存器重命名,并且不会用'eax`甚至做任何事情. (34认同)
  • 防止生成空字节操作码;)通过执行`xor eax,eax` (12认同)
  • 事实上,从大的角度来看,它的速度更快。需要从 RAM 中提取的字节更少。 (2认同)
  • 在现代架构中,xor会更快,因为在重命名阶段寄存器设置为零而不使用任何执行单元http://stackoverflow.com/a/18027854/995714 (2认同)

kri*_*ash 27

也是为了避免在编译时使用shell代码以利用缓冲区溢出等来使用0.为什么要避免使用0?嗯,0表示c/c ++中字符串的结尾,如果利用的平均值是字符串处理函数等,则shell代码将被截断.

顺便提一下,我提到了原来的问题:"有什么理由去做"xor eax,eax"?而不是MSVC++编译器的功能.

由于评论中关于这在现实世界中的相关性存在争议,请参阅本文Wikipedia上的这一部分.

  • 谁在乎?黑客做了,显然大部分与计算机安全相关的行业.在投票之前请先教育自己.你可以在这里找到更多的参考资料[剥削的艺术 - 第0x2a0章] [1]以及不包含0的样本shell代码.[1] [http://books.google.es/books?id=P8ijosP6ti4C&lpg=PP1&dq=the%20art%20of%20exploitation&pg=PA84#v=onepage&q=&f=false] (23认同)
  • 这对我来说听起来像是胡说八道.在你的代码中某处肯定会有零字节,所以我看不出还有一个会有多大差别.无论如何,谁在乎你是否可以欺骗程序将代码读作数据.真正的问题是将数据作为代码执行. (11认同)
  • 我不知道为什么这么多次被低估,wtf.对于选民失败,请在downvoting之前在shellcode中自学这个_MOST BASIC TECHNIQUE/KNOWLEDGE_. (4认同)
  • @ kizzx2可能是因为这里没有人解释如何在`.text`段中解析字符串.我也无法看到如何以某种方式终止字符串允许某人移动`.data`段以镜像`.text`段以便首先修改任何内容.请比*"MOST BASICIST TECHNIQUE"更具体* (4认同)
  • @ kizzx2你能否给出一个**解释**,说明你的程序指令段中的空字节如何使它更容易被利用.具有空字节仅影响字符串解析,据我所知,没有解析程序的指令段.请**解释**,不要引用一些关于使用msvc ++的不相关的内容 (4认同)
  • 这带来了TRS-80的记忆.我们中的一些人会在BASIC字符串中嵌入汇编例程.有一些字符绝对不会出现在源代码中而不会破坏它,所以任何这样的例程都必须仔细优化以避免使用这些字符. (2认同)
  • @ kizzx2不过,根据我在shellcode上发现的内容,避免空字节对于*编写* shell代码而不阻止代码被利用很重要。您能否*说明*指令段中的空字节如何使所述代码更易于利用? (2认同)

i_a*_*orf 14

xor eax, eax是一种更快的设置eax为零的方法.发生这种情况是因为你返回零.

in指令正在处理I/O端口.基本上从指定的端口读取数据dx并将其存储在中al.目前尚不清楚为什么会发生这种情况.这是一个似乎可以详细解释它的参考.

  • "in指令正在用I\O端口做事".但在这种情况下,它可能是由调试器在指令中间开始反汇编引起的"伪像". (8认同)
  • 我同意.但是,它仍然是它的作用. (5认同)
  • 答案是可编辑的. (2认同)