如何将伪操作用于指令



在汇编语言中,如何使用伪操作来执行指令?据我所知,汇编文件使用汇编程序转换为机器代码。有没有办法使用伪操作直接从程序集文件本身发送操作码?

例如,如果有一些指令,比如 ADD,其操作码为 0101。有没有办法利用我们对 ADD 的操作代码 0101 的知识,从某个内存位置使用 0101 只添加两个寄存器,而不是显式使用 ADD 指令?我正在寻找黑客,想知道这一点。

使用间接操作码(从指令中指定的数据位置检索指令字节)在我知道的任何机器语言中都不受支持。但您有以下可能性:

  • 自修改代码(您可以获得对自己的代码段的写入访问权限并动态修补代码字节)
  • 在数据区域中创建一个(短)代码片段,将该区域标记为可执行文件并跳转到其中(您可能会在那里创建一个子例程,如果它是 x86 程序集,则以 0xC3 结尾),然后使用 CALL 指令(或计算机上调用的任何内容)跳转到它。

你还没有指定你正在使用的汇编程序,但例如 GAS 具有.byte伪操作,可以简单地发出一个字节。请注意,0101 是二进制表示法,可能不适合汇编程序。应以十六进制指定操作码。

是的,这是可能的,事实上,缓冲区溢出或堆栈溢出漏洞利用来攻击系统安全的方式。 如果二进制值存储在可执行内存中,它们将作为机器语言指令加载和执行,0101 将 ADD(在您的示例中)。

最新更新