2017-08-15 132 views
0

我写了下面的汇编代码,通过我的文字书在英特尔64位语法汇编语言NASM错误

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' 

规定,但我得到这样 asmshell.asm在10号线一NASM错误:10 :错误:操作数大小不匹配 任何人都可以告诉我他们在我的代码中有什么错误。

任何人都可以告诉我一些很好的参考64位英特尔汇编指令。

+0

你如何使用'nasm',你如何试图建立自己的计划? –

+0

@Someprogrammerdude我使用这个命令nasm -f elf64 asmshell.asm –

+0

如果你的教科书建议'mov byte al,0x3b'它有什么好处?还有什么其他的尺寸? –

回答

0

如果你指的错误是在第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 
+0

谢谢@WeatherVane我修正了它,现在它编译顺利。汇编语言有时会令人沮丧。 –