【问题标题】:Null-terminated string, opening file for reading空终止字符串,打开文件以供读取
【发布时间】:2018-04-02 15:03:44
【问题描述】:

我正在试验sys_open 系统调用,我得到了文件描述符以供读取。这是我的程序:

SYS_exit equ 0x3C

SYS_open equ 0x02
O_RDONLY equ 0x00
O_WRONLY equ 0x01
O_RDWR equ 0x02

section .text
    global _start

_start:
    mov eax, SYS_open
    mov rdi, file_name
    mov rsi, O_RDONLY
    mov rdx, 0x00
    syscall

    mov eax, SYS_exit
    mov rdi, 0x00

    syscall

section .data
    file_name: db '/path/to/test\0'

所以当我运行strace ./bin 时,我得到了输出:

open("/path/to/test\\0", O_RDONLY) = -1 ENOENT (No such file or directory)
exit(0)   

删除空终端后,它似乎工作正常:

open("/path/to/test", O_RDONLY) = 3
exit(0)                                 = ?

我很好奇汇编器如何知道我的字符串的长度。二进制中数据部分的内容是这样的:

Contents of section .data:
 6000d8 2f706174 682f746f 2f746573 74        /path/to/test

我希望字符串被读取直到到达空终止符。它是如何工作的?

【问题讨论】:

  • 它起作用了,因为db 之后的填充为零。基于字符串长度的任何内容都不会写入输出文件,如果后面有任何其他数据,它会中断。
  • @PeterCordes 但我没有使用 int 0x80。仅限syscalls.
  • 笨蛋,我一定是睡着了。我想我在SYS_exit 之后看到了0x00 或其他东西,并且有一个下意识的反应,没有意识到它是mov00 不是80

标签: linux assembly nasm x86-64


【解决方案1】:

问题在于您定义以下数据的方式:

section .data
    file_name: db '/path/to/test\0'

缺少结尾的NUL 字符,因为字符串中的\0 对应于字符\0,因此应将其定义为:

section .data
    file_name: db '/path/to/test', 0

【讨论】:

  • 不错的答案。我对这个问题感到困惑,并相信数据部分的 OP 转储,事实上,它缺少 ` and 0` 字符。 :)
  • NASM 实际上可以翻译类似 C 的元字符串,如 \0,但您必须将它们括在反引号中。不知道如何在 SO 评论中格式化它,所以我可能会尝试进行一些编辑:db `\0` 应该在 NASM 中定义单个零字节。检查列表文件(-lnasm 选项)以验证组装后的机器代码输出。使用引号和撇号,您必须是字面意思,并使用答案中的方式来定义零。 nasm.us/doc/nasmdoc3.html#section-3.4.2
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多