从 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/version0444,因此对于这些文件,即使您是 root.

,您的程序也会像上面那样失败

但由于您不关心写入文件,只需使用值为 0 的标志 O_RDONLY。因此改为 xor ecx, ecx。通过此更改,该程序可以作为普通用户使用。

始终检查错误是个好主意。