系统调用

linux truss strace ltrace 对比 诊断调试程序

社会主义新天地 提交于 2020-02-04 13:21:13
strace、ltrace、truss作用 1.了解一个程序的工作原理(可以了解Linux下很多常用的命令实现的原理); 2.帮助定位程序中的问题(在开发工作时帮助定位问题); strace strace(strace - trace system calls and signals)能够跟踪进程使用的系统调用,并显示其内容。因此,当遇到调试不明的故障时,首先使用strace找出系统调用中出错的地方,通常能得到故障发生的线索,特别是与文件有关的错误、参数错误等。使用strace能够有效地发现系统调用失败有关的故障,但无法发现用户写出的程序或共享库中发生的错误。strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。跟踪程序的每个系统调用strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。 -i 找到地址方便GDB详细调试。给strace添加 -i 选项即可显示程序在哪个地址进行了系统调用,可以将该地址作为断点使用,然后使用GDB进一步定位问题。 ltrace ltrace能够跟踪进程的库函数调用 truss truss和strace命令达成的效果是基本一致的。truss和strace用来跟踪一个进程的系统调用或信号产生的情 strace ltrace区别 strace —— Trace

linux 系统调用fork()

帅比萌擦擦* 提交于 2020-02-04 02:29:05
头文件:   # include <unistd.h>   # include <sys/types.h> 函数原型:   pid_t fork ( void );   (pid_t 是一个 宏定义 ,其实质是int 被定义在# include < sys/types.h >中) 返回值: 若成功调用一次则返回两个值,子进程返回0, 父进程 返回子进程ID;否则,出错返回-1 函数说明:   一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而 父进程 中返回子进程ID。 子进程是 父进程 的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述 存储空间 的“副本”,这意味着父子进程间不共享这些存储空间。   Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"。其实学过汇编语言的人一定知道,一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。   "代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子程序的参数以及程序的局部变量

ARM exploit编写三

断了今生、忘了曾经 提交于 2020-02-04 02:08:43
上一个实验中我们已经介绍了reverse shell(反向shell)的原理,再回顾一下 在reverse shell的场景下,内网的机器会主动连接到外网的几次上,比如作为攻击者,我们会在系统上开放一个监听端口,等待来自目标主机的弹回的连接。 同样,还是先看看C语言是怎么实现的。 完整代码在reverse.c中 第一步是确定必要的系统函数,其参数和系统调用号。 看看给出的C代码,我们可以看到我们需要以下函数:socket,connect,dup2,execve。 可以使用以下命令计算出这些函数的系统调用号: 以socket为例 用这样办法,得到的系统调用号如下 每个函数涉及的参数可以使用man xxx来查看,以execve为例 已经整理好,如下所示 下一步是弄清楚这些参数的具体值。 一种方法是使用strace查看成功的reverse shell连接。 Strace是一种工具,可用于跟踪系统调用并监视进程与Linux内核之间的交互。 让我们使用strace来测试我们reverse shell的C版本。 为了避免无关代码的干扰,我们使用-e将输出限制为我们感兴趣的功能。 这里注意,因为是反向连接,而且我在源码里写死的端口是1337,所以我们需要在另一个终端中先监听端口 然后再运行生成的可执行文件 然后输入whoami命令测试

golang-协程理解

泄露秘密 提交于 2020-02-03 08:05:07
本文总结一下go协程的理解,如有错误望请指正。 网上都说协程是一种轻量级线程,线程又是一种轻量级的进程。这话在语言层面看来是没有错的,但它们的实现是不同的。 线程是cpu资源调度的最小单位。协程不由cpu进行调度,由应用程序进行调度,也就是由go进行调度。在go中,协程的调度也有专门的调度器。但go的协程调度器的复杂程度比cpu的线程调度器是要低许多的。 计算机进程/线程的运行是抢占式的,操作系统负责分配cpu执行时间给各个线程,当时间到达后,当前线程必须暂停进入睡眠,等待后续获得cpu执行时间再度恢复执行;当然线程也可以主动放弃cpu,进入睡眠,这一操作大多由程序员来控制。 协程实现原理 下面说下go中协程的实现原理,这些是我个人所知道的,错误之处望指正。 go中协程的实现原理还是基于线程的,大致由一个数据队列和多个线程实现。将一个个协程的代码放入数据队列,由go内部的线程去数据队列中拉取协程进行执行,协程本质还是运行在线程上的。go明面上并没有提供任何创建启动一个线程的方法,只提供了创建运行协程的方法。当用户创建的协程越来越多,线程处理不完时,go自己就会创建新的线程来执行协程。可以看到go本质上也是多线程的运行方式。但它与传统的一个请求一个线程的方式又有不同,在go中,http服务接受一个请求是创建一个协程来为这个请求服务的,可以看到,在资源利用方法

实现mypwd

徘徊边缘 提交于 2020-02-03 06:59:09
任务要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接 实现步骤 学习pwd命令 功能:pwd 命令来查看”当前工作目录“的完整路径。 命令格式:pwd [参数] -L:当目录为连接路径时,显示连接路径 -P:显示实际物理路径,而非使用连接(link)路径 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 通过man命令和grep命令来获取我们所需要的系统调用函数信息 man -k pwd;man -k dir |grep 2 对chdir命令继续研究, man chdir man -k read/open |grep dir 由此我们可以根据调用来写出伪代码 { getinode(".");获取当前目录节点 getinode(".."); 获取父目录节点 记录当前节点的目录名; 只有当inode == up_inode时,打印。 } 实现mypwd,测试mypwd 最后进行mypwd的测试 码云链接 来源: https://www.cnblogs.com/zxja/p/12022274.html

第一章 操作系统概论

帅比萌擦擦* 提交于 2020-02-02 12:32:07
用户可见寄存器 数据寄存器 地址寄存器 条件码寄存器 CPU主要部件为 运算器 控制器 寄存器 高速缓存 在单处理器环境下,两个程序交替在CPU上运行体现了并发性 批处理操作系统的缺点是 缺少交互性 只能在操作系统内核状态下运行的是 屏蔽中断 微内核结构表示客户机/服务器结构 用户程序在用户状态下使用特权指令而引起的中断是访管中断 操作系统为用户提供了多种使用接口,他们是 图标和菜单 命令行 系统调用 组成操作系统的主要部分通常是 进程线程管理 内存管理 设备管理 文件管理 用户应用程序不属于操作系统内核程序 用户编写程序时调用fork()创建进程,其使用的是操作系统提供给用户的系统调用的接口 中断服务程序不能作为进程来管理 用户编程需要打印输出,操作系统提供的系统调用是write() 操作系统的类型 批处理batch 交互式interactive 实时realtime 分布式distributed 个人计算机操作系统 网络操作系统 嵌入式操作系统 操作系统作为系统软件,为用户提供了高效使用计算机的接口 操作系统提供给用户 命令输入和系统调用 安卓操作系统的特性 移动应用 支持网络 当用户需要调用操作系统提供的文件读写功能时,首先执行的指令是访古管指令 研究操作系统的观点有很多他们分别是 软件的观点 资源管理的观点 进程的观点 虚拟机的观点 服务提供者的观点 从计算机应用角度来看

系统调用链路发生变更,如何评估测试范围

强颜欢笑 提交于 2020-02-01 17:18:45
1. 调用链路发生变更,是否有切换开关、一次性切换,还是一次性开关+流程开关控制。 2. 如果不是一键切换,新老并行时是否会有问题。 3. 老的调用链路需要回归受影响的业务流程,如果不能确保所有上游场景都能覆盖,至少本域内知晓的场景按处理流程分类后,进行测试。 4. 新的调用链路,需要测试切换开关、流程开关、新链路的业务场景都有覆盖,至少本域内知晓的场景按处理流程分类后,进行测试。 5. 新的调用链路的请求日志、响应日志或者发Q日志和老的调用链路的请求、响应日志做对比。最好用同样的测试数据,用工具对比时,能降低比对成本。 6. 原来老的被调用系统和新的被调用系统,处理性能是否存在差异。是否对我们域应用的处理流程产生影响,是否需要根据性能差异做流程调整。 来源: https://www.cnblogs.com/live-for-learning/p/12249021.html

操作系统基本功特征、基本功能、系统调用、大内核和微内核、中断分类

狂风中的少年 提交于 2020-01-31 11:12:41
目录 1.操作系统的基本特征 (1)并发 (2)共享 (3)虚拟 (4)异步 2.操作系统的基本功能 (1)进程管理 (2)内存管理 (3)文件管理 (4)设备管理 3.系统调用 4.大内核和微内核 (1)大内核 (2)微内核 5.中断分类 1.外中断 2.异常 3.陷入 1.操作系统的基本特征 (1)并发 并发 是指宏观上在一段时间内能同时运行多个程序,而 并行 则指同一时刻能运行多个指令。 (2)共享 共享是指系统中的资源可以被多个并发进程共同使用。 有两种共享方式:互斥共享和同时共享。 互斥共享的资源称为临界资源:在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。。 (3)虚拟 虚拟技术把一个物理实体转换为多个逻辑实体。 主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。 (4)异步 异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。 2.操作系统的基本功能 (1)进程管理 (2)内存管理 (3)文件管理 (4)设备管理 3.系统调用 如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。 Linux 的系统调用主要有以下这些: Task Commands 进程控制 fork();exit();wait(); 进程通信 pipe();shmget();mmap(); 文件操作 open();read

linux系统调用过程剖析

此生再无相见时 提交于 2020-01-31 10:48:03
前言 linux中用户空间程序调用内核功能的唯一方式就是系统调用,内核中实现了一种跨平台的通用框架和实现方式,使得系统调用接口一致并且高效。系统调用和普通的函数调用有一些不同,系统调用函数位于内核中,需要从ring 3切换到ring 0,而且系统调用函数是通过系统调用号来使用而普通函数是通过地址使用。 普通的系统调用 我们以read系统调用为例来看系统调用是怎么实现的,read系统调用实现位于 fs/read_write.c 中,它的原型中通过 SYSCALL_DEFINE3() 宏来包裹的: SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) { struct fd f = fdget_pos(fd); ssize_t ret = -EBADF; /* ... */ SYSCALL_DEFINEn() 宏是一种标准的系统调用定义方式,其中 n 表示参数的个数,它是在 include/linux/syscalls.h 中声明的,这个宏展开就有两个输出: SYSCALL_METADATA(_read, 3, unsigned int, fd, char __user *, buf, size_t, count) __SYSCALL_DEFINEx(3, _read, unsigned

内核系统与用户程序的关系

百般思念 提交于 2020-01-31 10:43:06
  在Linux系统中,内核为应用程序提供了两方面的接口.其一是系统调用接口,即中断调用int0x80;另一方面是通过库函数与内核进行信息交流.库函数是基本C函数库的libc组成部分.许多系统调用是作为基本C语言函数库的一部分实现的.   系统调用主要是提供给系统软件直接使用或用于库函数的实现.而一般用户开发的程序则是通过调用像libc库中的函数来访问内核资源.通过调用这些库中的程序,应用程序代码能够完成各种常用工作,例如,打开和关闭文件或设备的访问,进行科学计算,出错处理以及访问组和用户标识号ID等系统信息.   系统调用是内核与外界接口的最高层.在内核中,每个系统调用都有一个序列号,并常以宏的形式实现.应用陈需不应该直接使用系统调用,因为这样的话,程序的移植性就不好了.因此目前Linux标准库LSB和许多其他表尊都不允许应用程序直接访问系统调用宏.   库函数一般包括C语言又没有提供的执行高级功能的用户级函数.例如输入输出函数和字符串处理函数.某些库函数指示系统调用的增强功能版.例如,标准I/O库函数fopen和fclose提供了与系统调用open和close类似的功能,但却是在更高的层次上.在这种情况下,系统调用通常能提供比库函数略微好一些的性能,但是库函数却能提供更多的功能,而且更具检错能力. 来源: CSDN 作者: 、moddemod 链接: https://blog