从 proc/sys/kernel/ 读取数据
Read data from proc/sys/kernel/
我想创建程序以获取有关操作系统的信息。我试过使用系统调用,但认为从系统文件中读取会更快(直接)。所以,我编写了一个简单的程序,用于从目录“/proc/sys/kernel/”的文件中读取数据,并希望读取文件:osrelease 主机名、ostype 和其他....所以,我确实认为只是但不是。当我读取文件“主机名”时,我得到了这个:
����
如果我以超级用户身份读取,我得到的是正常数据
oleg
这是我的程序代码:
global _start
section .data
file db "/proc/sys/kernel/hostname",0
section .bss
buf resb 1024
descriptor resb 4
len equ 1024
section .text
_start:
mov eax, 5
mov ebx, file
mov ecx, 2
int 80h
mov [descriptor], eax
read:
mov eax, 3 ;read text
mov ebx, [descriptor];
mov ecx, buf ;read to variable buf
mov edx, len ;size of bug
int 80h ;interrupt
print_text:
mov edx, eax
mov eax, 4
mov ebx, 1
mov ecx, buf
int 80h
close_file:
mov eax, 6
mov ebx, [descriptor]
int 80h
exit:
mov eax, 1
mov ebx, 0
int 80h
所以,我以为更改文件名可以获取其他系统信息,但这是错误的,因为我没有得到结果。因此,我更改文件路径、编译项目并以超级用户身份执行程序,但我没有得到结果。没有什么...
我可以读取除此目录(“proc/sys/kernel”)以外的所有文件。
我用谷歌搜索了有关此问题的信息,但没有找到类似的问题。我认为这是 OS 的安全性,但我只读信息,不写...我知道使用系统调用更简单,但想要了解 OS 的结构。为什么我不能从这个目录中读取信息?那么,请附上有关此问题的有用信息好吗?
mov ecx, 2
open()
的 flags
值为 2 是 O_RDWR
。您正在尝试以读写方式打开文件,作为普通用户您不能这样做,因为它只能由 root
(我的系统上的模式 0644
)写入。 Unix 权限检查是在您打开文件时完成的,而不是在每个单独的读取和写入时完成,因此即使您不打算实际写入文件也会失败。
因此 open
调用 returns 一个负错误代码(您不检查),您将其作为要读取的 fd 传递,因此也会失败并显示一个负错误代码(你也不检查)因此你的缓冲区仍然包含一堆零。您将此负错误代码作为长度传递给 write()
,它会将其解释为一个巨大的正数,并且不仅会写出 buf
中的零字节,还会写出内存中它后面的任何垃圾,直到它从您地址的末尾运行 space.
这对我作为 root 确实有效。我不太明白你的最后一段,也不知道在那种情况下它是否对你有用。如果没有,您可能有 securelevels 或其他一些机制,即使以 root 身份也能阻止写入文件。请注意 /proc/sys/kernel
中的一些其他文件即使 root
也不可写,例如/proc/sys/kernel/version
即 0444
,因此对于这些文件,即使您是 root
.
,您的程序也会像上面那样失败
但由于您不关心写入文件,只需使用值为 0 的标志 O_RDONLY
。因此改为 xor ecx, ecx
。通过此更改,该程序可以作为普通用户使用。
始终检查错误是个好主意。
我想创建程序以获取有关操作系统的信息。我试过使用系统调用,但认为从系统文件中读取会更快(直接)。所以,我编写了一个简单的程序,用于从目录“/proc/sys/kernel/”的文件中读取数据,并希望读取文件:osrelease 主机名、ostype 和其他....所以,我确实认为只是但不是。当我读取文件“主机名”时,我得到了这个:
����
如果我以超级用户身份读取,我得到的是正常数据
oleg
这是我的程序代码:
global _start
section .data
file db "/proc/sys/kernel/hostname",0
section .bss
buf resb 1024
descriptor resb 4
len equ 1024
section .text
_start:
mov eax, 5
mov ebx, file
mov ecx, 2
int 80h
mov [descriptor], eax
read:
mov eax, 3 ;read text
mov ebx, [descriptor];
mov ecx, buf ;read to variable buf
mov edx, len ;size of bug
int 80h ;interrupt
print_text:
mov edx, eax
mov eax, 4
mov ebx, 1
mov ecx, buf
int 80h
close_file:
mov eax, 6
mov ebx, [descriptor]
int 80h
exit:
mov eax, 1
mov ebx, 0
int 80h
所以,我以为更改文件名可以获取其他系统信息,但这是错误的,因为我没有得到结果。因此,我更改文件路径、编译项目并以超级用户身份执行程序,但我没有得到结果。没有什么... 我可以读取除此目录(“proc/sys/kernel”)以外的所有文件。 我用谷歌搜索了有关此问题的信息,但没有找到类似的问题。我认为这是 OS 的安全性,但我只读信息,不写...我知道使用系统调用更简单,但想要了解 OS 的结构。为什么我不能从这个目录中读取信息?那么,请附上有关此问题的有用信息好吗?
mov ecx, 2
open()
的 flags
值为 2 是 O_RDWR
。您正在尝试以读写方式打开文件,作为普通用户您不能这样做,因为它只能由 root
(我的系统上的模式 0644
)写入。 Unix 权限检查是在您打开文件时完成的,而不是在每个单独的读取和写入时完成,因此即使您不打算实际写入文件也会失败。
因此 open
调用 returns 一个负错误代码(您不检查),您将其作为要读取的 fd 传递,因此也会失败并显示一个负错误代码(你也不检查)因此你的缓冲区仍然包含一堆零。您将此负错误代码作为长度传递给 write()
,它会将其解释为一个巨大的正数,并且不仅会写出 buf
中的零字节,还会写出内存中它后面的任何垃圾,直到它从您地址的末尾运行 space.
这对我作为 root 确实有效。我不太明白你的最后一段,也不知道在那种情况下它是否对你有用。如果没有,您可能有 securelevels 或其他一些机制,即使以 root 身份也能阻止写入文件。请注意 /proc/sys/kernel
中的一些其他文件即使 root
也不可写,例如/proc/sys/kernel/version
即 0444
,因此对于这些文件,即使您是 root
.
但由于您不关心写入文件,只需使用值为 0 的标志 O_RDONLY
。因此改为 xor ecx, ecx
。通过此更改,该程序可以作为普通用户使用。
始终检查错误是个好主意。