Articles of 系统调用

x86_64程序集execve * char 系统调用

我试图进入一些Linux 64位x86程序集,而不使用标准的库,但是我有一些问题处理提交给我的程序(argv)的参数。 我会认为(基于文档) rsp标志着argc qword的开始,而[rsp + 8]将是argv。 不幸的是,情况并非如此,下面的(删节的)程序会导致EFAULT (Bad address) 。 sys_execve equ 59 sys_exit equ 60 section .data child db "/bin/sh", 0 global _start section .text _start: mov rdi, child ; #1 filename mov rsi, [rsp + 8] ; #2 argv mov rdx, 0 ; #3 envp = 0 mov rax, sys_execve ; execve […]

系统调用:sys_exit(),SYS_exit和exit()之间的区别

SYS_exit,sys_exit()和exit()有什么区别? 我明白: Linux内核提供了系统调用,这些man 2 syscalls在man 2 syscalls中列出。 glibc提供的系统调用的封装函数与系统调用的名称大多相似。 我的问题:在man 2 syscalls ,没有提及SYS_exit和sys_exit()。 他们是什么? 注意:这里的系统调用exit只是一个例子。 我的问题确实是:什么是SYS_xxx和sys_xxx()?

访问()有什么问题?

可能重复: 访问()安全漏洞 我从man page访问引用(2): 警告 :使用access ()检查用户是否被授权在实际上打开文件之前,使用open (2)会创build安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔操纵它。 出于这个原因,应该避免使用这个系统调用。 这是什么意思,在什么情况下会是一个问题?

我怎么知道一个Linux系统调用是否是线程安全的?

linux中的一些函数用_r标记“线程安全”(例如gmtime_r),但是大部分系统调用都没有标记,也没有在手册中提及。 所以我的问题是:我怎么知道一个Linux系统调用是否线程安全? 谢谢!

具有限制的Shellcode

对于我需要创build简单的shellcode的任务,但不允许它包含\ x80。 注意:要在linux上进行系统调用,比如写或者退出,你需要包括这行: int 0x80 ,最后会产生包含\ x80的shellcode。 不过,我需要进行系统调用,所以现在我的想法是使用一个variables作为中断向量编号。 例如0x40,然后将它乘以2,所以最后在shellcode中会有一个\ x40而不是\ x80。 问题是int不是把一个variables作为参数,我试过这个testing: section .data nr db 0x80 section .text global _start _start: xor eax, eax inc eax xor ebx, ebx mov ebx, 0x1 int [nr] 得到 错误:操作码和操作数无效组合 我怎么能让我的想法工作? 或者你有不同的解决scheme? PS。 sysenter和系统调用不起作用 – >非法指令 我在x86-32bit机器上使用nasm。

为什么系统调用挂钩在Linux / Android 2.6.29中每次都会产生不同的结果?

我已经通过LKM module实现了Android 2.6.29内核的系统调用挂钩。 我正在追查一个Android应用程序的系统调用。 但有趣的是,每当我得到一个系统调用列表,它都会返回不同的结果。 我不能在代码部分做出粗体文本,所以我已经把**显示差异开始的地方。 例如, 第一次运行: our_sys_gettid —> uid = 10028 our_sys_open —> uid = 10028 with filename= /dev/cpuctl//tasks, flags= 131073, mode=0 our_sys_write —> uid = 10028 with fd= 30, buf = 230 and count=3 our_sys_close —> uid = 10028 with fd= 30 our_sys_setpriority —> uid = 10028 with which= 0, who=230 and […]

使用process_vm_readv从另一个进程修改整数值

我正在使用Ubuntu Linux编写两个程序。 我正在尝试从另一个进程更改整数的值。 我的第一个过程(一)是一个简单的程序,永远循环,并显示在屏幕上的值。 这个程序按预期工作,只是在屏幕上显示值-1430532899(0xAABBCCDD)。 #include <stdio.h> int main() { //The needle that I am looking for to change from another process int x = 0xAABBCCDD; //Loop forever printing out the value of x int counter = 0; while(1==1) { while(counter<100000000) { counter++; } counter = 0; printf("%d",x); fflush(stdout); } return 0; } 在单独的terminal中,我使用ps -e命令列出进程并logging进程(A)的进程标识。 […]

使用Ptrace来跟踪正在打开的文件的位置

我正在使用下面的代码,每当打开一个系统调用被调用时,它实际上会让我得到寄存器(eax,ebx,ecx)中的内容。 经过很多的斗争,我明白了这个问题的价值。 ebx包含指向文件名的指针。 但是当我尝试访问它时,我得到了一个分段错误。 我哪里错了? 代码可以从这里访问

将数据从内核空间复制到用户空间

我正在尝试进行自定义的系统调用。 我的系统调用需要2个参数struct buffer **mybuffer & int size 。 它强加的任何变化发生在**mybuffer应该在用户空间反映,但它似乎不起作用。 所以我见过其他地方,我可以使用copy_to_user(void *dest, void *src, int size)将数据从内核空间复制到用户空间。 在用户空间中,我有一个叫做缓冲区的结构体,这个结构体在系统调用中也是一样的。 typedef struct buffer { int n; }buffer; int main(void) { buffer **buf = malloc(sizeof(buffer *)); int i = 0 for(;i<8;i++) buf[i] = malloc(sizeof(buffer)); long int sys = systemcall(801,buf,8) //print out buf return 0; } 在系统调用我有 asmlinkage long sys_something(buffer **buf,int […]

劫持系统调用

我正在写一个内核模块,我需要劫持/包装一些系统调用。 我很强制sys_call_table地址,我正在使用cr0来禁用/启用页面保护。 到目前为止,这么好(我会公布整个代码,所以我可以更新这个问题,如果有人想要的话)。 无论如何,我注意到,如果我劫持__NR_sys_read当我卸载内核模块,并且所有konsoles(KDE)崩溃时,我得到一个内核oops。 请注意, __NR_sys_open或__NR_sys_write不会发生这种情况。 我想知道为什么会发生这种情况。 有任何想法吗? PS:请不要去KProbe的方式,我已经知道了它,我不能使用它,因为最终产品应该是可用的,无需重新编译整个内核。 编辑 :(添加信息) 卸载前我恢复原来的function。 另外,我创build了两个testing用例,一个用_write而另一个用_read 。 用_write那个卸载好了,但是带有_read那个卸载然后崩溃了内核)。 编辑 :(源代码) 我现在在家,所以我现在不能发布源代码,但如果有人想要,我可以发布一个示例代码,只要我开始工作。 (约5小时)