Assembly 程序集错误-写入字符串时需要指令
在为外壳代码编写最简单的程序集时,我编写了以下代码Assembly 程序集错误-写入字符串时需要指令,assembly,nasm,shellcode,Assembly,Nasm,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,
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“Some string”不是有效的指令(标签和消息),但如果我将其写为db,则可以
(我还感兴趣的是,如果我写.section数据而不是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
)
我对这一切有点陌生,但我想我知道我在做什么
为什么是告诉我我的代码poruka:.ascii“Some string”
不是有效的指令(标签和消息),但如果我将其写为db
,则可以
汇编程序之间的语法和指令不同.ascii
是GNU汇编程序可以识别的指令,但是对于NASM,您可以使用db
(声明字节),正如您已经发现的那样
(我还感兴趣的是,如果我写.section数据而不是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
因为
section
是NASM可以识别的指令,而.section
不是。所以NASM认为您正在声明一个名为section
的本地标签(在NASM语法中,以句点开头的标签名被认为是本地的)因此NASM看到一个名为section
的本地标签,后面跟着一个单词data
,这毫无意义。欢迎使用Stackoverflow,这里不欢迎使用pastebin站点,因为内容仅在使用db
的两侧临时可用,NASM将允许您将字符串括在单引号、双引号或双引号中“反引号”(我们在这里用来表示code
)的字符。反引号,而不是其他两个,将允许Nasm识别“\n”和其他C-ish转义序列。否则,您将看到“\n”作为文本。