1. 程式人生 > >linux系統呼叫的三種方法

linux系統呼叫的三種方法

通過glibc提供的庫函式

[23:02:14] gcc chmodtest.c 
[23:02:17] ls -l kali   //記得先建立這個檔案
-rwxrwxrwx. 1 root root 0 May 10 22:56 kali
[23:02:25] ./a.out
chmod succeed
[23:02:29] ls -l kali
-rw-rw-rw-. 1 root root 0 May 10 22:56 kali
[23:02:34] cat chmodtest.c 
#include<stdio.h>
int main()
{
        int rc=chmod("./kali"
,0666); //這個必須是4個數字,我用三個數,發現修改的許可權對不上 if(rc==-1) { perror("chmod fail\n"); //這個是用來列印錯誤的 } else printf("chmod succeed\n"); return 0; } [23:02:46]

通過syscall直接呼叫

[23:10:58] gcc chmodtest1.c
[23:11:01] ls -l kali
-rw-rw-rw-. 1 root root 0
May 10 22:56 kali [23:11:06] ./a.out chmod succeed [23:11:09] ls -l kali -rwxrwxrwx. 1 root root 0 May 10 22:56 kali [23:11:13] cat chmodtest1.c #include<stdio.h> #include<unistd.h> #include<sys/syscall.h> int main() { int rc=syscall(SYS_chmod,"./kali",0777);//syscall在標頭檔案unistd.h中,SYS_chmod在標頭檔案syscall.h中
if(rc==-1) { perror("chmod fail\n"); } else printf("chmod succeed\n"); return 0; } [23:11:18]

通過 int 指令陷入(還沒有理解是什麼意思)

#include <stdio.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <errno.h>

int main()
{
        long rc;
        char *file_name = "/etc/passwd";
        unsigned short mode = 0444;

        asm(
                "int $0x80"
                : "=a" (rc)
                : "0" (SYS_chmod), "b" ((long)file_name), "c" ((long)mode)
        );

        if ((unsigned long)rc >= (unsigned long)-132) {
                errno = -rc;
                rc = -1;
        }

        if (rc == -1)
                fprintf(stderr, "chmode failed, errno = %d\n", errno);
        else
                printf("success!\n");

        return 0;
}