为什么我在linux中用`write`系统调用无法实现写入?
Why can't I achive writting with `write` system-call in linux?
要事第一:
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/
并且文件关闭正常。
发生这种情况的原因可能是什么?
使用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, "#!@#$%$:[=10=]", 9) = -1 EBADF (Bad file descriptor)
close(3) = 0
exit(0) = ?
+++ exited with 0 +++
注意 O_RDONLY|O_CREAT
:您以只读方式打开文件,因此后续 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/ 并且文件关闭正常。
发生这种情况的原因可能是什么?
使用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, "#!@#$%$:[=10=]", 9) = -1 EBADF (Bad file descriptor)
close(3) = 0
exit(0) = ?
+++ exited with 0 +++
注意 O_RDONLY|O_CREAT
:您以只读方式打开文件,因此后续 write
失败。