Почему я не могу добиться записи с помощью `write` системного вызова в Linux? - PullRequest
0 голосов
/ 04 октября 2019

Перво-наперво:

format ELF

section '.text' executable

public _start
_start:
    ; OPENNIN FILE DESCRIPTOR FOR A PATH -->
    mov ebx, logfile
    mov eax, 5
    mov ecx, 64
    mov edx, 777o
    int 0x80

    ; JUNT `STRLEN` -->
    mov edi, ebx
    mov ebx, eax
    xor ecx, ecx
    not ecx
    xor eax, eax
    cld
    repne scasb
    not ecx

    ; WRITTING INTO THE FD'S FILE -->
    mov edx, ecx
    sub edi, edx
    mov ecx, edi
    lea edx, [edx]
    mov eax, 4
    int 0x80

    ; CLOSE DESCRIPTOR -->
    mov eax, 6
    int 0x80 

    ; EXIT -->
    mov eax, 1
    xor ebx, ebx
    int 0x80

section '.data' writeable

logfile db "#!@#$%$:",0

Выше приведен мой код, который я написал в fasm. При компиляции и запуске этого фрагмента кода (эта часть прошла хорошо, поэтому я не буду вдаваться в это.), Я сталкиваюсь с ситуацией -> Мой файл создан (и назван #!@#$%$:, конечно ...), но ничего не было написанок этому.

Я не могу понять причину, по которой что-то не записано в новый файл! Состояние регистров должно быть таким, как упомянуто в: https://syscalls.kernelgrok.com/ И файл закрылся нормально.

Что может быть причиной для этого?

1 Ответ

2 голосов
/ 04 октября 2019

Использование strace (1) скажет вам, почему немедленно:

$ strace ./test
execve("./test", ["./test"], 0x7ffef0f1b5f0 /* 72 vars */) = 0
strace: [ Process PID=32288 runs in 32 bit mode. ]
open("#!@#$%$:", O_RDONLY|O_CREAT, 0777) = 3
write(3, "#!@#$%$:\0", 9)               = -1 EBADF (Bad file descriptor)
close(3)                                = 0
exit(0)                                 = ?
+++ exited with 0 +++

Обратите внимание на O_RDONLY|O_CREAT: вы открыли файл только для чтения, таким образом,последующий write завершается неудачей.

...