我正在尝试注册一个新的syscall黑客攻击syscall表。我可以将一个函数注册为syscall,并且可以正确地调用它。但是,我不能传递参数。
我在Linux ubuntu上工作,内核版本5.0.0-25。
copy_from_user和copy_to_user不会返回任何错误,只是数据不会被复制。另外,仅仅传递一个值是不起作用的,因为我从内核读取了随机值。
目前,我的实现如下所示:
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:
#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。
发布于 2019-08-22 03:37:05
我正在尝试注册一个新的系统调用,它入侵了系统调用表。
这不是一种支持的添加系统调用的方法。它不会可靠或正确地工作。
如果要添加系统调用,请将其添加到内核本身中,然后重新构建内核。有关详细信息,请参阅"Adding a New System Call“上的内核文档,但请特别关注描述”系统调用替代方案“的部分--有许多方法可以在不添加新系统调用的情况下向内核添加功能。
发布于 2019-08-22 11:33:52
sys_ni_syscall是无效的系统调用。它被定义为没有传入参数,因此不能将参数传递到此syscall sys_ni_syscall中
当传入无效的系统调用号时,将调用该函数。
https://stackoverflow.com/questions/57597355
复制相似问题