我尝试使用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)
删除null-terminal后似乎工作正常:
open("/path/to/test", O_RDONLY) = 3
exit(0) = ?
我很好奇汇编程序如何知道我的字符串的长度。二进制文件中数据部分的内容如下:
Contents of section .data:
6000d8 2f706174 682f746f 2f746573 74 /path/to/test
我希望读取字符串直到到达null终止符。它是如何工作的?
答案 0 :(得分:5)
问题在于您定义以下数据的方式:
section .data
file_name: db '/path/to/test\0'
缺少尾随的NUL
字符,因为字符串中的\0
对应于字符\
和0
,因此应将其定义为:
section .data
file_name: db '/path/to/test', 0