zel*_*ell 2 x86 assembly machine-code
在 x86 汇编的例程中,如果代码包含指向两个有效地址之间的有效地址的跳转,会发生什么情况?这是一个人为的例子:
0x0001: mov ...
0x0005: add ...
0x0009: jmp 0x0003
Run Code Online (Sandbox Code Playgroud)
此外,我如何在本地计算机或在线上进行类似的实验?我检查了在线x86编辑器,如https://defuse.ca/online-x86-assembler.htm#disassemble,但它不允许我输入“0x0001”等指令地址。
不存在 \xe2\x80\x9cvalid\xe2\x80\x9d 或 \xe2\x80\x9cinvalid\xe2\x80\x9d 地址之类的东西。每个地址都可以跳转到,如果对应的页面被映射,则执行。
\n那么当你在\xe2\x80\x9d指令之间跳转\xe2\x80\x9c时会发生什么呢?嗯,处理器不知道你想要指令在哪里开始和结束。它只是执行它看到的字节。该代码与您期望的不同,因为 CPU 尝试将其他指令的中间解析为操作码。
\n您的具体示例没有充分说明我无法说出指令的结果。也许您可以提供一个完整指定的示例(包括机器代码),以便我可以给出更好的解释。
\nCPU将开始解码目标地址处的指令。
您在反汇编中看到的指令流(当使用类似 的工具时objdump)只是程序可执行字节的一种解释(假设给定的起点)。
事实上,“跳转到指令中间”是一种混淆技术,有时恶意软件会使用它来隐藏线性扫描反汇编程序的程序语义(例如objdump)。更复杂的反汇编程序将尝试遵循这些“未对齐”的跳转,但这可能是不可能的,具体取决于静态/动态可以/不能确定的内容。
Linn 和 Debray 的论文“Obfuscation ofexecutive code to Improve resistance to static disassemble”对此进行了更详细的讨论。
请参见第 3.2 节“垃圾插入”。您描述的场景就是他们所说的“部分或完全重叠指令”,即字节流的不同解释可以为重叠地址范围提供不同的汇编指令。