【问题标题】:Assembly Language nasm error汇编语言 nasm 错误
【发布时间】:2017-08-15 18:14:57
【问题描述】:

我已经按照教科书的规定用 intel 64 位语法编写了以下汇编代码

Section .text
global _short
_start:
        jmp short    Gotocall
shellcode:
        pop             rcx
        xor             eax,eax
        mov byte        [rcx+8], al
        lea             rdi, [rax]
        mov long        [rcx+8], rdi
        mov long        [rcx+12], eax
        mov byte        al, 0x3b
        mov             rsi, rax
        lea             rdi, [esi+8]
        lea             edx, [esi+12]
        int             0x80

Gotocall:

        call            shellcode
        db              '/bin/shJAAAAKKKK'

但我在第 10 行收到一个 nasm 错误,如下所示 asmshell.asm:10:错误:操作数大小不匹配 谁能告诉我他们在我的代码中有什么错误。

谁能告诉我一些关于 64 位英特尔汇编指令的好的参考资料。

【问题讨论】:

  • 你如何调用nasm,你如何尝试构建你的程序?
  • @Someprogrammerdude 我使用这个命令 nasm -f elf64 asmshell.asm
  • 如果您的教科书建议mov byte al, 0x3b 有什么好处吗? al 还可以是什么尺寸?
  • 是你的错字还是书上的错字?
  • @WeatherVane 是的,这是不必要的。我复制了书中的代码。

标签: linux assembly x86-64 shellcode


【解决方案1】:

如果你的意思是错误在第 10 行

mov long [rcx+8], rdi

我正要问你long 限定符的大小,但是下一行

mov long [rcx+12], eax

表明您正在将两个不同大小的寄存器移动到相同大小的目标。第一种情况64位寄存器rdi,第二种情况32位寄存器eaxlong不能同时满足它们。

为什么不直接删除long,因为通过指定寄存器,汇编器知道目标的大小?但遗憾的是,您只允许 4 字节内存来存储 64 位寄存器,由 [rcx+8] 后跟 [rcx+12] 提供。

也许你打算

mov long [rcx+8], edi

【讨论】:

  • 感谢@WeatherVane 我更正了它,现在它可以顺利编译。汇编语言有时会令人沮丧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多