Sourav Rai Sourav Rai -3 years ago 108
Linux Question

Assembly Language nasm error

I have written the following assembly code as prescribed by my text book in the intel 64 bit syntax

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'


but i get a nasm error in line 10 like this
asmshell.asm:10: error: mismatch in operand sizes
Can anybody tell me what mistake is their in my code.

And can anybody please tell me some good references to the 64 bit intel assembly instructions.

Answer Source

If you mean the error is on line 10

mov long [rcx+8], rdi

I was about to ask you what size long qualifier is, but the next line

mov long [rcx+12], eax

shows that you are moving two different sizes of register to the same size destination. In the first case the 64-bit register rdi, in the second case the 32-bit register eax, and long cannot satisfy them both.

Why not just drop the long since by specifying the register, the assembler knows the size of the destination? But sadly, you have only allowed 4 bytes memory to store a 64-bit register, given away by the [rcx+8] followed by [rcx+12].

Perhaps you intended

mov long [rcx+8], edi
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download