从 proc/sys/kernel/ 读取数据

OKI*_*KIS 1 linux x86 assembly nasm

我想创建程序以获取有关操作系统的信息。我尝试使用系统调用,但认为从系统文件读取会更快(直接)。所以,我编写了一个简单的程序,用于从目录“/proc/sys/kernel/”中的文件中读取数据,并希望读取文件:osrelease 主机名、ostype 和其他......所以,我确实认为只是但不是。当我阅读文件“主机名”时,我得到了这个:

????
Run Code Online (Sandbox Code Playgroud)

如果我以超级用户身份阅读,我会得到正常数据

oleg
Run Code Online (Sandbox Code Playgroud)

这是我的程序代码:

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
Run Code Online (Sandbox Code Playgroud)

所以,我想更改文件名并可以获得其他系统信息,但这是错误的,因为我没有得到结果。因此,我更改文件路径,编译项目并以超级用户身份执行程序,但没有得到结果。没什么……我可以读取除此目录(“proc/sys/kernel”)以外的所有文件。我在 google 上搜索了有关此问题的信息,但没有找到类似的问题。我认为这是操作系统的安全性,但我只阅读信息,不写...我知道使用 syscall 更简单,但想要不了解操作系统的结构。为什么我无法从该目录中读取信息?所以,你能附上关于这个问题的有用信息吗?

Nat*_*dge 6

mov ecx, 2
Run Code Online (Sandbox Code Playgroud)

flags的2值open()就是O_RDWR。您正在尝试以读写方式打开文件,作为普通用户,您不能这样做,因为它只能由root(0644我系统上的模式)写入。Unix 权限检查是在您打开文件时进行的,而不是在每个单独的读取和写入时进行,因此即使您不打算实际写入文件,也会失败。

所以open调用返回一个负错误代码(你没有检查),你将它作为 fd 传递给读取,因此也会失败并返回一个负错误代码(你也没有检查),因此你的缓冲区仍然包含一堆零。您将此负错误代码作为长度传递给write(),它会将其解释为一个巨大的正数,并且不仅写出 中的零字节buf,还写出内存中跟随它的任何垃圾,直到它运行到您的地址空间的末尾。

这确实对我有用。我不太明白你的最后一段,在这种情况下无法判断它是否适合你。如果没有,您可能有安全级别或其他一些机制,即使以 root 身份也可以阻止写入文件。请注意, 中的某些其他文件/proc/sys/kernel甚至无法写入root,例如/proc/sys/kernel/versionwhich is 0444,因此对于这些文件,即使您是root

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

在整个过程中检查错误将是一个好主意。