【问题标题】:Why can't I achive writting with `write` system-call in linux?为什么我不能在 linux 中使用 `write` 系统调用实现写入?
【发布时间】:2019-10-04 12:46:53
【问题描述】:

第一件事:

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/ 并且文件关闭得很好。

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

【问题讨论】:

  • 您的代码没有错误检查。另外,学习使用调试器和系统调用跟踪器。无论如何,问题是您以只读方式打开文件。将mov ecx, 64 更改为mov ecx, 65.
  • 它没有错误检查,因为我不需要那些......我只想使用系统调用。我使用 gdb 对其进行了调试,但如您所知 - 它没有显示函数中给出的数字的名称。在您推荐之后,我尝试了 strace ,它确实向我显示了与该数字等效的文本。那谢谢啦。我不知道那里可能。 @小丑
  • @ervervevevev 如果不检查错误,就不会注意到发生了什么错误。
  • 使用strace 进行错误检查对于在 asm 或 C 中使用系统调用的实验来说是正常的。比实际编写错误处理要容易得多,尤其是在 asm 中。但是如果你不知道 strace 的存在,那么你应该在使用 GDB 之后一直在其中一个 errno 头文件中查找 EAX/RAX 返回值。

标签: assembly x86 fasm


【解决方案1】:

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

【讨论】:

  • 在这种情况下,错误应该是EPERM,而不是EBADF。你确定strace 日志是正确的吗?
  • @fuz 输出正确:系统调用返回eax==0xfffffff7,即-EBADF。而the manEBADF fd 不是有效的文件描述符或未打开写入。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 2021-01-13
  • 2018-12-01
  • 1970-01-01
  • 2012-09-19
  • 2015-05-03
  • 2021-07-27
相关资源
最近更新 更多