系统调用

strace命令

末鹿安然 提交于 2020-03-04 15:14:07
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

Linux Rootkit Learning

萝らか妹 提交于 2020-03-04 09:51:56
目录 1. 学习Rootkit需要了解的基础知识 2. 挂钩(HOOKING) 3. 直接内核对象操作 4. LSM框架(Linux Security Module)于LKM安全 5. rootkit检测技术及工具 1. 学习Rootkit需要了解的基础知识 0x1: 什么是rootkit rootkit是允许某人控制操作系统的特定方面而不暴露他或她的踪迹的一组代码。从根本上说来,用户无法察觉这种特性构成了rootkit。rootkit会想尽办法去隐藏自己的网络、进程、I/O等信息(注意,这里所谓的隐藏,只是针对ring3的ui隐藏,内核层的功能不能隐藏,否则rootkit自己也无法使用功能了),所以,rootkit的攻防问题很大程度上是一个ring0争夺战的问题,监控程序必须直接深入到系统的底层去获取最原始的数据,才能避免因为rootkit的ring3隐藏导致的误判 0x2: 可装载内核模块(LKM) Linux就是通常所说的单内核(monolithic kernel),它与微型内核(windows系统中常见)不同 1. Linux中的单内核 操作系统的大部分功能都被称为内核,并在特权模式下运行。同时,linux也提供动态扩充系统功能的机制(可以将新的功能加载到内核、从内核去除某个功能),通过Linux内核模块(LKM)可以在运行时动态地更改Linux的内核

Linux Signal

*爱你&永不变心* 提交于 2020-03-04 08:07:07
哪些情况会引发信号 1.键盘事件 ctrl +c ctrl +\ 2.非法内存 如果内存管理出错,系统就会发送一个信号进行处理 3.硬件故障 同样的,硬件出现故障系统也会产生一个信号 4.环境切换 比如说从用户态切换到其他态,状态的改变也会发送一个信号,这个信号会告知给系统 进程表的表项中有一个软中断信号域,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。 内核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。这里要补充的是,如果信号发送给一个正在睡眠的进程,那么要看 该进程进入睡眠的优先级,如果进程睡眠在可被中断的优先级上,则唤醒进程;否则仅设置进程表中信号域相应的位,而不唤醒进程。这一点比较重要,因为进程检 查是否收到信号的时机是:一个进程在即将从内核态返回到用户态时;或者,在一个进程要进入或离开一个适当的低调度优先级睡眠状态时。 运行如下命令,可看到Linux支持的信号列表: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15)

分析system_call中断处理过程

北战南征 提交于 2020-03-02 04:46:37
最初版本的MenuOS只支持version和help命令,显然这并不能满足我们的需求。我们现在来为它添加一个fork命令和fork-asm命令,其作用是测试fork的系统调用。 要增加一个命令也并不难,只需要~/LinuxKernel/linux-3.18.6/menu/test.c里的main函数中添加下面一行,然后添加它的实现(需要定义在main函数前面)就可以了。 MenuConfig("fork","Test system call fork",Fork); 最后一个参数Fork是一个函数指针,也就是我们对它的定义: int Fork(int argc, char *argv[]) { pid_t fpid; int count = 0; fpid = fork(); printf("Now pid = %d\n", fpid); if(fpid < 0) printf("Error in fork!"); else if(fpid == 0){ printf("I am the child process, my process id is: %d\n", getpid()); count++; } else{ printf("I am the parent process, my process id is: %d\n", getpid()); count++; }

Linux下文件I/O系统调用

て烟熏妆下的殇ゞ 提交于 2020-03-02 04:30:20
文件类型 Linux系统中把一切都看做文件,Linux有7中类型文件:普通文件-、目录(dierectory)文件、符号(link)链接、字符 (character)设备文件、块(block)设备文件、管道(pipe)文件、套接字(socket)文件。其中文件、目录、符号链接会占用磁盘 空间来存储,而块设备、字符设备、套接字、管道是伪文件,并不占用磁盘空间。 文件类型 文件类型标识 文件类型 - 普通文件 d 目录文件 l 符号链接 c 字符设备 b 块设备 p 管道 s 套接字socket 文件描述符 文件描述符(file descriptor, fd) 是Linux内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小 整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序在开始运行时,系统会自动打开三个 文件描述符,0是标准输入,1是标准输出,2是标准错误。POSIX标准要求每次打开文件时(含socket)必须使用当前进程 中最小可用的文件描述符号码,因此第一次打开的文件描述符一定是 3 . 文件描述符 用途 POSIX文件描述符 标准I/O文件流 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO stdout 2 标准出错 STDERR_FILENO stderr 文件I/O操作函数

Linux下嵌入汇编代码调用API(using fork())

狂风中的少年 提交于 2020-03-02 04:23:32
以下关于fork()的描述来自于: jason314 首先,在Linux环境下,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误(如系统资源不足),fork返回一个负值。 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。 现在,我们来写一段程序,使用API调用fork: #include <stdio.h> #include <unistd.h> int main() { pid_t fpid; int count = 0; fpid = fork(); printf("Now pid = %d\n", fpid); if(fpid < 0) printf("Error in fork!"); else if(fpid == 0){ printf("I am the

brk和sbrk及内存分配函数相关

空扰寡人 提交于 2020-03-01 03:30:04
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这 一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理 下将虚拟地址空间映射到内存,供malloc函数使用。(参见linux内核情景分析) #include <unistd.h> int brk(void *end_data_segment); void *sbrk(ptrdiff_t increment); DESCRIPTION brk sets the end of the data segment to the value specified by end_data_segment, when that value is reasonable, the system does have enough memory and the process does not exceed its max data size (see setrlimit(2)). sbrk increments the program's data space by increment

系统调用

强颜欢笑 提交于 2020-02-29 18:16:15
系统调用 知识总览 什么是系统调用,有和作用? “系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务 问题:操作系统为什么要提供“系统调用”功能? 生活场景:去学校打印店打印论文,当你按下“打印”之后,打印机开始工作。你的论文打印到一半时,另一位同学按下“打印”按钮开始打印他自己的论文。最终,你的论文和该同学的论文页面并没有混在一起,都是按顺序依次打印的。 思考:如果各个进程可以随意地使用打印机,会发生声明情况? 你的论文打印到一半,另一位同学按下“打印”按钮开始打印他自己的论文。结果,你的后半部分论文与该同学的页面混杂在一起。 解决办法:操作系统提供“系统调用”功能,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统发出请求。操作系统会对各个请求进行协调管理。 应用程序通过系统调用请求操作系统的服务。系统中的各种共享资源都由操作系统统一管理,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户非法操作。 系统调用需要特权指令,需要在核心态进行 系统调用背后的过程 知识回顾 来源: https://www.cnblogs.com

Head First C 第九章 进程与系统调用 出错处理

断了今生、忘了曾经 提交于 2020-02-29 02:47:55
Head First C 第九章 进程与系统调用 出错处理 大多数的系统调用以相同的方式出错 需求:想知道系统调用为什么会失败,因此所有的系统调用都遵循“失败黄金法则”。 尽可能的收拾残局 把errno变量设为错误码 返回-1 errno 变量是定义在 errno.h 中的全局变量,和它定义在一起的还有很多标准错误码。 EPERM=1 不允许操作 ENOENT=2 没有该文件或目录 ESRCH=3 没有该进程 使用strerror打印标准错误 #include <errno.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { if (execl("ifconfig", "ifconfig", NULL) == -1) if (execlp("kryptonite", "kryptonite", NULL) == -1) { fprintf(stderr, "Can not run ipconfig:%s\n", strerror(errno)); return 1; } return 0; } 系统调用在出错时通常会返回-1,但不是绝对的 系统调用在出错的同时,将errno变量设为错误码。 来源: oschina 链接: https://my.oschina.net/u/2491285

操作系统原理实验(一)

蹲街弑〆低调 提交于 2020-02-27 04:22:58
写在开头开头 近日新型冠状肺炎很严重,学校也开不了学了,在MOOC上学习操作系统原理时 看到老师留下的全靠自觉完成的实验题,在这里记录一下。 本篇给出 1,2两题的解析,3,4在下一篇中分享 3.1 (实验目的:熟悉Windows批处理编程)在Windows环境下,编写一个批处理程序(算命大师.bat),程序运行后,输入:出生年月日(例如20000731)。系统输出你的属相和星座,例如:你属兔,狮子座。 3.2 (实验目的:熟悉Linux脚本编程)在Linux环境下,编写一个Shell脚本理程序,能统计给定文本文件的单词数,行数。 3.3 (实验目的:了解操作系统生成的概念,熟悉Linux内核编译和裁剪)在Ubuntu或Fedora环境下裁剪和编译Linux内核,并启用新的内核。源代码下载网址:www.kernel.org. 3.4 (实验目的:熟悉Linux系统调用原理)在Ubuntu或Fedora环境下为Linux内核增加1-3个新的系统调用,并启用新的内核,编写一个应用程序测试新增加的系统调用是否能正确工作。源代码下载网址:www.kernel.org. ---------------------------------------------------------------------------------------------------- 3