首页 > 解决方案 > 为什么我不能在 linux 中使用 `write` 系统调用来实现写入?

问题描述

第一件事:

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/ 并且文件关闭正常。

发生这种情况的原因可能是什么?

标签: assemblyx86fasm

解决方案


使用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失败。


推荐阅读