Articles of 系统调用

如何使用克隆系统调用分配新的TLS区域

问题的短版本:如果我想为我正在创build的线程分配一个新的TLS区域,则需要在x86_64 Linux系统上传递给clone系统调用的参数。 长版本 : 我正在研究一个研究项目,对于我正在做的一些尝试,我想用clone系统调用来创build线程,而不是使用pthread_create 。 不过,我也希望能够使用线程本地存储。 我现在不打算创build多个线程,所以我可以为我使用克隆系统调用创build的每个线程创build一个新的TLS区域。 我正在查看clone的手册页,它包含有关TLS参数标志的以下信息: CLONE_SETTLS (since Linux 2.5.32) The newtls argument is the new TLS (Thread Local Storage) descriptor. (See set_thread_area(2).) 于是我看了set_thread_area的手册页,注意到以下看起来很有希望的内容: When set_thread_area() is passed an entry_number of -1, it uses a free TLS entry. If set_thread_area() finds a free TLS entry, the value of u_info->entry_number is set upon […]

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 […]