Linux程序集中的文件权限
我正在尝试获取有关文件权限的信息。我正在使用sys_访问系统调用。以下是我的代码片段:Linux程序集中的文件权限,linux,assembly,permissions,system-calls,Linux,Assembly,Permissions,System Calls,我正在尝试获取有关文件权限的信息。我正在使用sys_访问系统调用。以下是我的代码片段: mov eax, 33 mov ebx, fileName mov ecx, 1 int 80h cmp eax, 0 jl .error 如果eax为-1,则会出现错误,并且我没有收到错误,但我需要检查文件的所有权限(所有者、组、其他人)。我该怎么做?您可以使用内核函数sys\u newstat(No.106-查看)来获取文件权限。结构stat是一个永无止境的恐怖,但以下示例至少适用于我的D
mov eax, 33
mov ebx, fileName
mov ecx, 1
int 80h
cmp eax, 0
jl .error
如果
eax
为-1,则会出现错误,并且我没有收到错误,但我需要检查文件的所有权限(所有者、组、其他人)。我该怎么做?您可以使用内核函数sys\u newstat
(No.106-查看)来获取文件权限。结构stat
是一个永无止境的恐怖,但以下示例至少适用于我的Debian Wheezy 64位(NASM、32位和64位模式):
access(2)
不返回文件权限。它测试当前进程是否具有在第二个参数中指定的权限。若要获取权限,请使用stat(2)
。它返回一个包含文件信息的结构,包括权限模式。谢谢,它解决了我的问题。现在我尝试使用chmod()来更改这些权限,但是当我使用我在这里找到的标记[link]()来设置这些权限时,它们并不是我想要的。当我将ecx设置为00400 | 00200时,它将所有者设置为读写,并且(不知道为什么)将guest设置为可以写。虽然当我使用00400 | 00200 | 00040时,它的集同时读取和写入。你能帮我解决这个问题吗?试着问一个新问题。好吧,基本上都是一样的(几乎就是标题),所以我认为这不是一个好的选择。谢谢你的回答,我已经设法让stat()正常工作了。现在我陷入了我在上面评论中提到的问题。现在我想更改该文件的权限(请查看评论)。@TreeZ:问一个新问题,告诉我们assembler、linker和Linux版本,并展示一个-也许我明天会处理;-)
SECTION .data
filename db '/root' ; Just an example, can be replaced with any name
filename_len equ $ - filename ; Length of filename
db 0 ; Terminator for `Int 80h / EAX = 106`
perm_out db 'Permissions: '
perm db 'drwxrwxrwx'
perm_len equ $ - perm ; Index of last character in `perm`
lf db 10
perm_out_len equ $ - perm_out ; Length of `Permissions: ...\n`
SECTION .bss
stat resb 256 ; Way too much, but size is variable depending on OS
SECTION .text
global _start
_start:
mov eax,4 ; sys-out
mov edx,filename_len ; length of string to print
mov ecx,filename ; Pointer to string
mov ebx,1 ; StdOut
int 0x80 ; Call kernel
mov eax,4 ; sys-out
mov edx,1 ; Length of string to print
mov ecx, lf ; Pointer to string
mov ebx,1 ; StdOut
int 0x80 ; Call kernel
mov eax, 106 ; sys_newstat
mov ebx, filename ; Pointer to ASCIIZ file-name
mov ecx, stat ; Pointer to structure stat
int 80h
test eax, eax
jz .noerr
mov eax,1 ; sys_exit
mov ebx,1 ; Exit code, 1=not normal
int 0x80 ; Call kernel
.noerr:
movzx eax, word [stat + 8] ; st_mode (/usr/include/asm/stat.h)
mov ebx, perm_len
; rwx bits
mov ecx, 9
.L1:
sub ebx, 1
shr eax, 1
jc .J1
mov byte [perm + ebx], '-'
.J1:
loop .L1
; directory bit
sub ebx, 1
shr eax, 6
jc .J2
mov byte [perm + ebx], '-'
.J2:
mov eax,4 ; sys-out
mov edx,perm_out_len ; Length of string to print
mov ecx,perm_out ; Pointer to string
mov ebx,1 ; StdOut
int 0x80 ; Call kernel
mov eax,1 ; sys_exit
mov ebx,0 ; Exit code, 0=normal
int 0x80 ; Call kernel