首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统调用劫持:如何传递参数?

系统调用劫持:如何传递参数?
EN

Stack Overflow用户
提问于 2019-08-22 02:27:59
回答 2查看 321关注 0票数 2

我正在尝试注册一个新的syscall黑客攻击syscall表。我可以将一个函数注册为syscall,并且可以正确地调用它。但是,我不能传递参数。

我在Linux ubuntu上工作,内核版本5.0.0-25。

copy_from_user和copy_to_user不会返回任何错误,只是数据不会被复制。另外,仅仅传递一个值是不起作用的,因为我从内核读取了随机值。

目前,我的实现如下所示:

代码语言:javascript
复制
unsigned long sys_call_table = 0xffffffffbb6001e0;
unsigned long sys_ni_syscall = 0xffffffffba6bd800;

asmlinkage int sys_my_first_sys_call(void){
    printk("%s: zero-params sys-call has been called\n",MODNAME);
    return 0;
}

asmlinkage int sys_my_second_sys_call(int a){
    printk("%s: 1-param sys-call has been called (with param %d)\n",MODNAME,a);
    return 0;
}

unsigned long new_sys_call_array[HACKED_ENTRIES] = {sys_my_first_sys_call,sys_my_second_sys_call};

int init_module(void) {

    unsigned long * p = (unsigned long *) sys_call_table;
    int i,j;
    int ret;

    unsigned long cr0;

    printk("%s: initializing\n",MODNAME);
    j = -1;
    for (i=0; i<256; i++){
        if (p[i] == sys_ni_syscall){
            printk("%s: table entry %d keeps address %p\n",MODNAME,i,(void*)p[i]);
            j++;
            restore[j] = i;
            if (j == (HACKED_ENTRIES-1)) break;
        }
    }

    cr0 = read_cr0();
        write_cr0(cr0 & ~X86_CR0_WP);
    for(i=0;i<HACKED_ENTRIES;i++){
        p[restore[i]] = (unsigned long)new_sys_call_array[i];
    }
    write_cr0(cr0);

    printk("%s: all new system-calls correctly installed on sys-call table \n",MODNAME);

    ret = 0;

    return ret;
}

用户空间中,我通过以下方式调用sycall:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv){

    int sys_call_num, arg;

    if(argc < 2){ 
                printf("usage: prog syscall-num [syscall-param]\n");
                return;
        }


        sys_call_num = strtol(argv[1],NULL,10);
        if (argv[2]){
            arg = strtol(argv[2],NULL,10);
            syscall(sys_call_num,arg);
            return 0;
        }

    syscall(sys_call_num);

    return 0;
}

调用syscall并向其传递params将导致打印随机值,如下所示

1-param sys-call has been called (with param -1017053352)

有人知道为什么会发生这种情况吗?我不认为这是个bug。

EN

回答 2

Stack Overflow用户

发布于 2019-08-22 03:37:05

我正在尝试注册一个新的系统调用,它入侵了系统调用表。

这不是一种支持的添加系统调用的方法。它不会可靠或正确地工作。

如果要添加系统调用,请将其添加到内核本身中,然后重新构建内核。有关详细信息,请参阅"Adding a New System Call“上的内核文档,但请特别关注描述”系统调用替代方案“的部分--有许多方法可以在不添加新系统调用的情况下向内核添加功能。

票数 0
EN

Stack Overflow用户

发布于 2019-08-22 11:33:52

sys_ni_syscall是无效的系统调用。它被定义为没有传入参数,因此不能将参数传递到此syscall sys_ni_syscall

当传入无效的系统调用号时,将调用该函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57597355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档