assembly - 为什么我不能在 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/ 并且文件关闭正常。
发生这种情况的原因可能是什么?
解决方案
使用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
失败。
推荐阅读
- c++ - Directx 11 - CompileFromFile() 未编译
- regex - Zend 中的正则表达式电子邮件验证
- python - 为什么我在运行我的 python ping 脚本时收到主机未找到错误?
- ios - 如何在 iOS 中对图像实现 XMP 预设过滤器
- r - 如何编写一个函数来根据控制数据集在 R 中剪切许多列
- javascript - 检查包含文档中所有对象ID的数组字段中是否存在对象ID的最佳方法是什么?
- python - 调用 plt.subplot() 重置子图大小
- python - Pipenv 虚拟环境将我拉入不同的目录
- makefile - 如何从一个 GNU makefile 和大部分相同的源构建两个交互式网站?
- django - 按末端嵌套关系搜索 django rest 框架