如何使用伪操作指令?

时间:2014-11-30 07:02:21

标签: assembly inline-assembly x86-16

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

例如,如果有一些指令,比如ADD,其操作码为0101.有没有办法利用我们对ADD的操作码的知识为0101,只使用ADD两个寄存器0101来自某个内存位置而没有明确使用ADD指令?我正在寻找一个黑客,并想知道这一点。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,这是可能的,实际上是缓冲区溢出或堆栈溢出漏洞如何工作来攻击系统安全性。如果二进制值存储到可执行存储器中,它们将作为机器语言指令加载和执行,并且0101将添加(在您的示例中)。