【问题标题】:Linux sys_open in 64-bit NASM returns negative value64 位 NASM 中的 Linux sys_open 返回负值
【发布时间】:2019-12-05 20:21:36
【问题描述】:

我正在使用 sys_open 和 sys_write 打开现有文件以写入其中。当我创建一个新文件时, sys_write 可以正常工作,如下所示。但是如果我使用 sys_open,则返回值为负(-13,即“权限被拒绝”)并且写入不起作用(当然)。

这行得通:

section .data
File_Name: db '/opt/Test_Output_Files/Linux_File_Test',0
File_Mode: dq 754q
Write_Buffer: db 'This is what I want to write',0

section .text

; Create file
mov rax,85 ; sys_creat
mov rdi,File_Name
mov rsi,File_Mode  ; mode (permissions)
syscall

mov rdi,rax ; return code from sys_creat
mov rax,1 ; sys_write
mov rsi,Write_Buffer
mov rdx,29
syscall

但是当我打开现有文件时,sys_open 命令失败:

mov rax,2 ; sys_open
mov rdi,File_Name
mov rsi,2 ;read-write
mov rdx,[File_Mode]
syscall

因为这是一个权限错误,所以问题很可能是 rsi 中的标志值,因为 rdx 中的模式值与我在 sys_creat (754) 中使用的模式值相同。根据http://man7.org/linux/man-pages/man2/open.2.htmlhttps://linux.die.net/man/3/open 的Linux 手册页,需要三个选项:

O_RDONLY - Open for reading only. 
O_WRONLY - Open for writing only. 
O_RDWR - Open for reading and writing. The result is undefined if this flag is applied to a FIFO.

我知道只读是零,所以我假设只写和读写是 1 和 2,但是我没有找到任何我们将在汇编语言中使用的数值列表,不像模式基于 chmod ——它与我用于创建的模式值相同,它有效。

我对此进行了广泛的研究,但是关于 64 位系统调用的信息很少——其中大部分是 32 位的。对于 NASM,我需要为 rsi 中的标志使用数值。手册页说“此外,零个或多个文件创建标志和文件状态标志可以在标志中按位或进行。文件创建标志是 O_CLOEXEC、O_CREAT、O_DIRECTORY、O_EXCL、O_NOCTTY、O_NOFOLLOW、O_TMPFILE 和 O_TRUNC。 "如果我知道它们的值是什么,我可以按位或它们。

感谢您对此的任何帮助。

【问题讨论】:

  • 尝试使用 mov rsi, 0754o 直接对你的模式进行编码。
  • 谢谢,但不幸的是这也不起作用。
  • “返回值为负” 究竟是什么? IE。您遇到了哪个具体错误?
  • @RTC222 执行系统调用指令后 rax 寄存器中的值是多少?你说的是负数,但实际数字是多少?
  • 我更新了上面的问题——返回值为-13,权限被拒绝。这表明问题在于,正如我上面所说,rsi 中的标志值。我还没有找到任何标志的数值来源,因此我可以对它们进行异或以创建正确的值。 Linux 手册页中的值适用于 C 程序,但不适用于汇编。

标签: linux x86-64 nasm


【解决方案1】:

我的猜测是,您对尝试打开的文件没有 O_RDWR 权限。

你应该试试 O_RDONLY。

无论如何,回答你的问题。 就标志值而言,它们将是:

O_CREAT(0x40)
O_TRUNC(0x200)
O_APPEND(0x400)

您可以在以下位置找到整个列表:

/usr/include/asm-generic/fcntl.h

注意:如果未设置 O_CREAT,则“模式”(您在 rdx 中设置的值)将被忽略。

【讨论】:

  • 谢谢。我会处理这个并稍后发回。为什么选择 O_RDONLY?我需要写入这个文件。它是在具有写入权限的情况下创建的。您引用的包含文件可能会导致正确的组合。
  • 只是为了测试 O_RDONLY 是否有效。一旦确认,您将必须弄清楚为什么 sys_create 没有为您的文件设置正确的权限。即你想要 rw
  • 根据 fcntl.h,这是零。我现在就试试。
  • 只读 (0) 有效。只写 (1) 和读写 (2) 都失败了 -13 Permission denied。
  • 在你的 sys_creat 调用中,你有 mov rsi,File_Mode 那不应该是 mov rsi,[File_Mode]
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2016-07-13
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多