汇编错误 - 写入字符串时需要的指令

时间:2013-08-11 17:59:31

标签: assembly nasm shellcode

在为shellcode编写最简单的程序集时,我编写了这段代码

BITS 64
global _start
section .data
_start:
  ;ssize_t write(int fd, const void *buf, size_t count);
  ;rax = 1

jmp poziv

vracajse:
xor rsi,rsi
pop rsi
xor rax,rax
mov al,1 ; were calling write
;The parameters are in rdi, rsi, rdx, r10, r8, r9. in that order
xor rdi,rdi ;
xor rcx,rcx ; need low 8 bytes dont want null in machine code
mov cl,1
mov edi,ecx ; edi =1 writing to stdout
xor rdx,rdx
mov dl,15 ; were writing 15 chars
syscall

poziv:
call vracajse

poruka:
.ascii "Pozdrav svete!\n"

并收到以下错误

writing_2nd_try.nasm:28: error: parser: instruction expected

为什么告诉我我的代码poruka: .ascii“某些字符串”不是有效的指令(标签和消息),但如果我将其写为db,那么它就可以了。

(同样有趣的是,如果我写.section数据而不是.data我会得到以下错误

writing_2nd_try.nasm:3: error: attempt to define a local label before any non-local labels
writing_2nd_try.nasm:3: error: parser: instruction expected

我对这一切都不熟悉,但我以为我知道自己在做什么。

1 个答案:

答案 0 :(得分:1)

  

为什么告诉我我的代码poruka: .ascii "Some string"不是有效的指令(标签和消息),但是如果我把它写成db那么就可以了。

汇编程序的语法和指令不同。 .ascii是GNU汇编程序识别的指令,但是对于NASM,您使用db(声明字节)代替,正如您已经发现的那样。

  

(同样有趣的是,如果我写.section数据而不是.data我会得到以下错误

因为section是NASM识别的指令,而.section不是。因此,NASM认为您正在声明一个名为section的本地标签(以句点开头的标签名称在NASM语法中被视为本地标签)。因此NASM会看到一个名为section的本地标签,后跟单词data,这没有任何意义。