0

シェルコードの最も単純なアセンブリを書いているときに、このコードを書きました

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 .data の代わりに .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

)

私はこれらすべてに少し慣れていませんが、自分が何をしているのか知っていると思いました。

4

1 に答える 1

1

私のコードporuka: .ascii "Some string"が有効な命令 (ラベルとメッセージ) ではないことを教えてくれるのはなぜですかdb

構文とディレクティブはアセンブラによって異なります。.asciiはGNUアセンブラによって認識されるディレクティブですが、すでに発見したように、NASMdbでは代わりに (declare byte) を使用します。

(私にとって興味深いのは、 section .data の代わりに .section data を書き込むと、次のエラーが発生することです

sectionは NASM によって認識されるディレクティブであるため、そうで.sectionはありません。そのため、NASM は、という名前のローカル ラベルを宣言してsectionいると見なします (ピリオドで始まるラベル名は、NASM 構文ではローカルと見なされます)。そのため、NASM は、という名前sectionの後に という単語が続くローカル ラベルを認識しdataますが、これは意味がありません。

于 2013-08-11T18:44:39.183 に答える