【问题标题】:Assembly error - instruction expected while writing a string汇编错误 - 写入字符串时需要指令
【发布时间】:2013-08-11 17:59:31
【问题描述】:

在为 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 "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

)

我对这一切有点陌生,但我认为我知道自己在做什么。

【问题讨论】:

  • 欢迎来到 Stackoverflow,pastebin 网站在这里不受欢迎,因为内容只是暂时可用

标签: assembly nasm shellcode


【解决方案1】:

为什么告诉我我的代码 poruka: .ascii "Some string" 不是有效指令(标签和消息),但如果我将其写为 db 则没关系。

汇编器之间的语法和指令不同。 .ascii 是 GNU 汇编器识别的指令,但您已经发现,在 NASM 中,您使用 db(声明字节)。

(对我来说也很有趣的是,如果我写 .section 数据而不是 section .data 我会收到以下错误

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

【讨论】:

  • 除了使用db,Nasm 还允许您将字符串括在单引号、双引号或“反引号”中(我们在这里使用的字符表示code)。反引号,但不是其他两个,将允许 Nasm 识别 "\n" 和其他 C-ish 转义序列。否则你只会看到“\n”作为文本。
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2013-06-12
  • 2015-07-19
  • 2016-07-27
  • 2011-06-11
相关资源
最近更新 更多