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 更简单,但想要不了解操作系统的结构。为什么我无法从该目录中读取信息?所以,你能附上关于这个问题的有用信息吗?
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。。通过此更改,该程序可以作为普通用户使用。
在整个过程中检查错误将是一个好主意。