2017-08-15 150 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我修正了它,現在它編譯順利。彙編語言有時會令人沮喪。 –