gpt4 book ai didi

assembly - 为何完成旅行?

转载 作者:行者123 更新时间:2023-12-03 15:29:41 27 4
gpt4 key购买 nike

我最近发现了这个:https://github.com/xoreaxeaxeax/movfuscator
看来mov是图灵完整的事实。是真的,为什么?

最佳答案

是的,x86的mov已完成图灵化。我将这个标签添加到您的问题中,因为对于其他ISA来说,使用mov指令可能不是正确的,并且movfuscator编译器仅针对x86。

它本身不是在“mov”进行计算,它是x86寻址模式,可以进行加法(和移位)。我没有详细研究它的工作方式,但是很大程度上依赖于查找表,并且像mov eax, [base + eax*4]这样的东西会根据EAX为0或1加载两个可能的值之一。

还要记住x86 mov has several forms:在内存和寄存器之间(加载,存储或reg <-reg),或者直接在内存或寄存器之间。并具有包括绝对和间接寄存器在内的寻址模式。

我不认为它依赖于自我修改的代码,但是如果我做错了,请纠正我。 (如果确实如此,我认为/希望movfuscator至少不会创建mov以外的指令。那会是作弊。)

而且,这只是一种事实;您需要某种方法来循环主程序,并假设原始源代码不是直线无循环的-Movfuscator github自述文件对此进行了讨论:

While Dolan's paper required a jmp instruction, the M/o/Vfuscator does not - it uses a faulting mov instruction to achieve the infinite execution loop. If you're worried that this is still "jumping", the same effect could be achieved through pages aliased to the same address, wrapping execution around the upper range of memory, ring 0 exception handling, or simply repeating the mov loop indefinitely. A jmp is currently used to dispatch external functions - if this is a problem, avoid using external functions, or compile libraries with the M/o/Vfuscator as well.



当为仅运行mov的代码创建用户空间环境时,我假设它创建了一个SIGSEGV处理程序(在POSIX OS上),该处理程序从顶部重新开始执行。因此,任何有故障的负载都可以重新启动主循环。

还提到了让执行回绕的可能性:

IP的环绕在IP为16位但CS:IP形成20位线性地址(实模式)或在16位保护模式下在线性地址空间中某个64k窗口的16位模式下可以很好地工作。也就是说,您只能在部分地址空间中保留一个64k的指令块,而剩余的空间用于存储数据。 DS分割受众群可以使用其他基准。 (可以使用16位模式下的32位寻址模式,因此您仍具有任何寄存器和缩放索引寻址模式的全部功能。)请注意,用于读取和写入段寄存器的助记符也是 mov

但是在EIP为32位的32位模式下更困难,因此在seg + off计算之后,线性地址也是如此。除非有其他技巧,否则绕回只能在整个地址空间中进行,而不管您使用分段如何。这不会为数据留出任何非代码空间。设置较低的段限制可能会导致代码提取错误,但这不会引起环绕(除非您设置了信号处理程序,或者在裸机上设置了中断处理程序地址)。

无论哪种方式,即使x86-64都只有64位指针(理论上,实际上是48位或57位), 因此空间是有限的,这与带有无限磁带的真正图灵机不同。

关于assembly - 为何完成旅行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61048788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com