0x00 前言
本文汇总下开发过程中收集的一些 Linux 系统调用及用法
0x01 常用系统调用分类
进程控制
fork:创建一个新进程clone:按指定条件创建子进程execve:运行可执行文件exit:中止进程_exit:立即中止当前进程getdtablesize:进程所能打开的最大文件数getpgid:获取指定进程组标识号setpgid:设置指定进程组标志号getpgrp:获取当前进程组标识号setpgrp:设置当前进程组标志号getpid:获取进程标识号getppid:获取父进程标识号getpriority:获取调度优先级setpriority:设置调度优先级modify_ldt:读写进程的本地描述表nanosleep:使进程睡眠指定的时间nice:改变分时进程的优先级pause:挂起进程,等待信号personality:设置进程运行域prctl:对进程进行特定操作ptrace:进程跟踪sched_get_priority_max:取得静态优先级的上限sched_get_priority_min:取得静态优先级的下限sched_getparam:取得进程的调度参数sched_getscheduler:取得指定进程的调度策略sched_rr_get_interval:取得按 RR 算法调度的实时进程的时间片长度sched_setparam:设置进程的调度参数sched_setscheduler:设置指定进程的调度策略和参数sched_yield:进程主动让出处理器, 并将自己等候调度队列队尾vfork:创建一个子进程,以供执行新程序,常与execve等同时使用wait:等待子进程终止wait3:参见waitwaitpid:等待指定子进程终止wait4:参见waitpidcapget:获取进程权限capset:设置进程权限getsid:获取会晤标识号setsid:设置会晤标识号
文件系统控制
1、文件读写操作
fcntl:文件控制open:打开文件creat:创建新文件close:关闭文件描述字read:读文件write:写文件readv:从文件读入数据到缓冲数组中writev:将缓冲数组里的数据写入文件pread:对文件随机读pwrite:对文件随机写lseek:移动文件指针_llseek:在64位地址空间里移动文件指针dup:复制已打开的文件描述字dup2:按指定条件复制文件描述字flock:文件加 / 解锁poll:I/O 多路转换truncate:截断文件ftruncate:参见truncateumask:设置文件权限掩码fsync:把文件在内存中的部分写回磁盘
2、文件系统操作
access:确定文件的可存取性chdir:改变当前工作目录fchdir:参见chdirchmod:改变文件方式fchmod:参见chmodchown:改变文件的属主或用户组fchown:参见chownlchown:参见chownchroot:改变根目录stat:取文件状态信息lstat:参见statfstat:参见statstatfs:取文件系统信息fstatfs:参见statfsreaddir:读取目录项getdents:读取目录项mkdir:创建目录mknod:创建索引节点rmdir:删除目录rename:文件改名link:创建链接symlink:创建符号链接unlink:删除链接readlink:读符号链接的值mount:安装文件系统umount:卸下文件系统ustat:取文件系统信息utime:改变文件的访问修改时间utimes:参见utimequotactl:控制磁盘配额
系统控制
ioctl:I/O 总控制函数_sysctl:读 / 写系统参数acct:启用或禁止进程记账getrlimit:获取系统资源上限setrlimit:设置系统资源上限getrusage:获取系统资源使用情况uselib:选择要使用的二进制函数库ioperm:设置端口 I/O 权限iopl:改变进程 I/O 权限级别outb:低级端口操作reboot:重新启动swapon:打开交换文件和设备swapoff:关闭交换文件和设备bdflush:控制bdflush守护进程sysfs:取核心支持的文件系统类型sysinfo: 取得系统信息adjtimex: 调整系统时钟alarm: 设置进程的闹钟getitimer: 获取计时器值setitimer: 设置计时器值gettimeofday: 取时间和时区settimeofday: 设置时间和时区stime: 设置系统日期和时间time: 取得系统时间times: 取进程运行时间uname: 获取当前 UNIX 系统的名称、版本和主机等信息vhangup: 挂起当前终端nfsservctl: 对 NFS 守护进程进行控制vm86: 进入模拟 8086 模式create_module: 创建可装载的模块项delete_module: 删除可装载的模块项init_module: 初始化模块query_module: 查询模块信息get_kernel_syms: 取得核心符号, 已被query_module代替
内存管理
brk: 改变数据段空间的分配sbrk: 参见brkmlock: 内存页面加锁munlock: 内存页面解锁mlockall: 调用进程所有内存页面加锁munlockall: 调用进程所有内存页面解锁mmap: 映射虚拟内存页munmap: 去除内存页映射mremap: 重新映射虚拟内存地址msync: 将映射内存中的数据写回磁盘mprotect: 设置内存映像保护getpagesize: 获取页面大小sync: 将内存缓冲区数据写回硬盘cacheflush: 将指定缓冲区中的内容写回磁盘
网络管理
getdomainname: 取域名setdomainname: 设置域名gethostid: 获取主机标识号sethostid: 设置主机标识号gethostname: 获取本主机名称sethostname: 设置主机名称
socket 控制
socketcall: socket 系统调用socket: 建立 socketbind: 绑定 socket 到端口connect: 连接远程主机accept: 响应 socket 连接请求send: 通过 socket 发送信息sendto: 发送 UDP 信息sendmsg: 参见sendrecv: 通过 socket 接收信息recvfrom: 接收 UDP 信息recvmsg: 参见recvlisten: 监听 socket 端口select: 对多路同步 I/O 进行轮询shutdown: 关闭 socket 上的连接getsockname: 取得本地 socket 名字getpeername: 获取通信对方的 socket 名字getsockopt: 取端口设置setsockopt: 设置端口参数sendfile: 在文件或端口间传输数据socketpair: 创建一对已联接的无名 socket
用户管理
getuid: 获取用户标识号setuid: 设置用户标志号getgid: 获取组标识号setgid: 设置组标志号getegid: 获取有效组标识号setegid: 设置有效组标识号geteuid: 获取有效用户标识号seteuid: 设置有效用户标识号setregid: 分别设置真实和有效的的组标识号setreuid: 分别设置真实和有效的用户标识号getresgid: 分别获取真实的, 有效的和保存过的组标识号setresgid: 分别设置真实的, 有效的和保存过的组标识号getresuid: 分别获取真实的, 有效的和保存过的用户标识号setresuid: 分别设置真实的, 有效的和保存过的用户标识号setfsgid: 设置文件系统检查时使用的组标识号setfsuid: 设置文件系统检查时使用的用户标识号getgroups: 获取后补组标志清单setgroups: 设置后补组标志清单
进程间通信
ipc: 进程间通信总控制调用
1、信号
sigaction: 设置对指定信号的处理方法sigprocmask: 根据参数对信号集中的信号执行阻塞 / 解除阻塞等操作sigpending: 为指定的被阻塞信号设置队列sigsuspend: 挂起进程等待特定信号signal: 参见 signalkill: 向进程或进程组发信号*sigblock: 向被阻塞信号掩码中添加信号, 已被sigprocmask代替*siggetmask: 取得现有阻塞信号掩码, 已被sigprocmask代替*sigsetmask: 用给定信号掩码替换现有阻塞信号掩码, 已被sigprocmask代替*sigmask: 将给定的信号转化为掩码, 已被sigprocmask代替*sigpause: 作用同sigsuspend, 已被sigsuspend代替sigvec: 为兼容 BSD 而设的信号处理函数, 作用类似sigactionssetmask: ANSI C 的信号处理函数, 作用类似sigaction
2、消息
msgctl: 消息控制操作msgget: 获取消息队列msgsnd: 发消息msgrcv: 取消息
3、管道
pipe: 创建管道
4、信号量
semctl: 信号量控制semget: 获取一组信号量semop: 信号量操作
5、共享内存
shmctl:控制共享内存shmget:获取共享内存shmat:连接共享内存shmdt:拆卸共享内存
0x02 系统调用关联的hook备份
fork
tracepoint/sched/sched_process_fork:进程创建事件tracepoint/sched/sched_process_exit:进程退出事件tracepoint/sched/sched_process_free:进程释放事件
execve*
tp/syscalls/sys_execvetp/syscalls/sys_exit_execvetp/syscalls/sys_execveattp/syscalls/sys_exit_execveat
bash
uretprobe/bash_readlineuretprobe/bash_retval:bash返回值
fd
tp/syscalls/sys_closetp/syscalls/sys_exit_closetp/syscalls/sys_enter_creattp/syscalls/sys_exit_creattp/syscalls/sys_enter_opentp/syscalls/sys_exit_opentp/syscalls/sys_enter_openattp/syscalls/sys_exit_openattp/syscalls/sys_enter_openat2tp/syscalls/sys_exit_openat2
connect
kprobe/tcp_v4_connectkretprobe/tcp_v4_connectkprobe/tcp_v6_connectkretprobe/tcp_v6_connect
pipe
tracepoint/syscalls/sys_enter_duptracepoint/syscalls/sys_enter_dup2tracepoint/syscalls/sys_enter_dup3tracepoint/syscalls/sys_eixt_duptracepoint/syscalls/sys_exit_dup2tracepoint/syscalls/sys_exit_dup3tracepoint:syscalls:sys_enter_pipetracepoint:syscalls:sys_enter_pipe2tracepoint:syscalls:sys_exit_pipetracepoint:syscalls:sys_exit_pipe2
安全对抗
tp/syscalls/sys_enter_getdents64tp/syscalls/sys_exit_getdents64tp/syscalls/sys_enter_getdentstp/syscalls/sys_exit_getdentstracepoint:syscalls:sys_enter_memfd_createtracepoint:syscalls:sys_exit_memfd_create
可观测(tracing)
tracepoint/syscalls/sys_enter_connecttracepoint/syscalls/sys_exit_connecttracepoint/syscalls/sys_enter_accepttracepoint/syscalls/sys_exit_accepttracepoint/syscalls/sys_enter_accept4tracepoint/syscalls/sys_exit_accept4tracepoint/syscalls/sys_enter_closetracepoint/syscalls/sys_exit_closetracepoint/syscalls/sys_enter_writetracepoint/syscalls/sys_exit_writetracepoint/syscalls/sys_enter_readtracepoint/syscalls/sys_exit_readtracepoint/syscalls/sys_enter_sendmsgtracepoint/syscalls/sys_exit_sendmsgtracepoint/syscalls/sys_enter_recvmsgtracepoint/syscalls/sys_exit_recvmsg
数据包(协议栈流向)可观测
kprobe/__skb_datagram_iterkprobe/skb_copy_datagram_iovectracepoint/skb/skb_copy_datagram_iovectracepoint/net/netif_receive_skbkprobe/tcp_queue_rcvkprobe/tcp_rcv_establishedkprobe/tcp_v4_do_rcvkprobe/tcp_v6_do_rcvkprobe/tcp_v4_rcvkprobe/ip_rcv_corekprobe/dev_hard_start_xmitkprobe/dev_queue_xmitkprobe/__ip_queue_xmitkprobe/__ip_queue_xmitkprobe/nf_nat_packetkprobe/nf_nat_manip_pktkprobe/security_socket_sendmsgkprobe/security_socket_recvmsgtracepoint/syscalls/sys_enter_recvfromtracepoint/syscalls/sys_exit_recvfromtracepoint/syscalls/sys_enter_readtracepoint/syscalls/sys_exit_readtracepoint/syscalls/sys_enter_recvmsgtracepoint/syscalls/sys_exit_recvmsgtracepoint/syscalls/sys_enter_readvtracepoint/syscalls/sys_exit_readvtracepoint/syscalls/sys_enter_sendfile64tracepoint/syscalls/sys_exit_sendfile64tracepoint/syscalls/sys_enter_sendtotracepoint/syscalls/sys_exit_sendtotracepoint/syscalls/sys_enter_writetracepoint/syscalls/sys_exit_writetracepoint/syscalls/sys_enter_sendmsgtracepoint/syscalls/sys_exit_sendmsgtracepoint/syscalls/sys_enter_writevtracepoint/syscalls/sys_exit_writevtracepoint/syscalls/sys_enter_closekprobe/sys_closetracepoint/syscalls/sys_exit_closetracepoint/syscalls/sys_enter_connecttracepoint/syscalls/sys_exit_connecttracepoint/syscalls/sys_enter_accept4tracepoint/syscalls/sys_exit_accept4