要想在Linux系统上开发或研究木马病毒等特殊程序,我们需要使用一系列强大的开发和调试攻击。本节先介绍几种在Linux系统上极为强大的工具。...第一个当然是gdb了,在Linux上,它是唯一能用于程序调试的利器。.../sys_read 执行后结果如下图: ? 可以看到read函数读入的内容被显示出来。.../sys_read 它读取可执行文件sys_read的段头表,该表的具体内容后面我们会介绍。 readelf -s ./sys_read 该命令读取可执行文件的符号表。 readelf -r ..../sys_read 该命令读取可执行文件的重定向入口。
0 bash(26570): -> sys_read 0 bash(26570): -> sys_write 0 bash(26570): -> sys_read.../b.out < huge_dump.sql stap输出: 0 bash(26570): -> sys_read 0 bash(26570): -> sys_read...0 b.out(28926): -> sys_close 0 b.out(28926): -> sys_read 0 b.out(28926): -> sys_read...0 bash(26570): -> sys_wait4 0 bash(26570): -> sys_write 0 bash(26570): -> sys_read bash...结论:Linux下大文件重定向效率更高。
二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...sys_ni_syscall) .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) .long SYMBOL_NAME(sys_read...翻译成 C 代码如下: long sys_call_table[] = { sys_ni_syscall, sys_exit, sys_fork, sys_read, sys_write...Linux 使用寄存器来传递参数,参数与寄存器的关系如下: 第1个参数放置在 ebx 寄存器。 第2个参数放置在 ecx 寄存器。 第3个参数放置在 edx 寄存器。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。
Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。...在Linux内核,所有的网络设备都被抽象为一个接口处理,该接口提供了所有的网络操作。 net_device结构表示网络设备在内核中的情况,也就是网络设备接口。...Linux内核有一个dev_base的全局指针,指向一个设备链表,包括了系统内的所有网络设备。该设备链表每个节点是一个网络设备。 ...net_device结构保存在include/linux/netdevices.h头文件,理解该结构对理解网络设备驱动有很大帮助。 ...sock_read()函数读取接收到的数据缓冲,把数据返回给 sys_read()系统调用。sys_read()函数调用最终把数据复制到用户空间,供用户使得。
sys_read 函数。...至此,内核真正开始处理 read 系统调用(sys_read 是 read 系统调用的内核入口)。...引入 cache 层的目的是为了提高 linux 操作系统对磁盘访问的性能。 Cache 层在内存中缓存了磁盘上的部分数据。...虚拟文件系统层的处理 read系统调用对应的内核函数是sys_read。...为了满足普遍性要求,linux使用定义在linux/fs.h中的结构体address_space结构体描述页高速缓存中的页面。
2 《Linux操作系统原理与应用》解释: 陈莉君老师的《Linux操作系统原理与应用(第二版)》对Linux系统调用解释为: 系统调用的实质就是函数调用,只是调用的函数是系统函数,处于内核态而已...system call, used for r estarting */ .long sys_exit .long ptregs_fork .long sys_read...include进去的,arch/x86/include/asm/unistd_64.h中放着: #define __NR_read 0 __SYSCALL(__NR_read, sys_read...__NR_syscall_max] = &sys_ni_syscall, [0] = sys_read, [1] = sys_write, [2] = sys_open...- ld-linux-x86-64.so.2:程序解释器(链接器)。
在Linux系统中,可以使用多种文件系统来挂载不同的设备,如 ext2、ext3、nfs等等。...那么Linux是如何做到的呢?这就得益于 虚拟文件系统(Virtual File System,简称 VFS)。...虚拟文件系统抽象数据结构 Linux奉行了Unix的理念:一切皆文件,比如一个目录是一个文件,一个设备也是一个文件等,因而文件系统在Linux中占有非常重要的地位。...注册文件系统 Linux为了支持不同的文件系统而创造了虚拟文件系统,虚拟文件系统更像一个规范(或者说接口),真实的文件系统需要实现虚拟文件系统的规范(接口)才能接入到Linux内核中。...读写文件 读取文件内容通过 read() 系统调用完成,而 read() 系统调用最终会调用 sys_read() 内核函数,sys_read() 内核函数的实现如下: asmlinkage ssize_t
; } } /// 从控制台读取一个字符(阻塞) pub fn getchar() -> u8 { let mut c = [0u8; 1]; sys_read(STDIN,...实现各种系统调用 use super::*; use alloc::{format, string::String}; pub const SYS_READ: usize = 63; pub const...=> sys_read(args[0], args[1] as *mut u8, args[2]), SYS_WRITE => sys_write(args[0], args[1] as...当遇到系统调用 sys_read 时,再相应从缓冲区中取出一定数量的字符。 os/src/kernel/fs.rs //!...为输入流加入条件变量后,就可以使得调用 sys_read 的线程在等待期间保持休眠,不被调度器选中,消耗 CPU 资源。
的中断机制 1、分类 Linux的中断分为硬件中断和软件中断 硬中断:由电脑中主机的 8259A 类似的硬件中断控制芯片发出的中断或 ARM 中断控制器发出的中断 软中断:称为异常 第一类:CPU...自行保留的中断 第二类:系统调用异常 2、代码结构 汇编文件 对应的c文件 linux/kernel/asm.s trap.c linux/kernel/system_call.s fork.c signal.c...跳转回正常工作的函数地址继续运行 2、Linux 中中断的工作流程 ①....,中断后的回复过程 中断的执行过程 硬件中断的处理过程 linux/kernel/asm.s traps.c 软件及系统调用的处理过程 linux/kernel/system_call.s fork.c...所有的系统调用 C 函数放到了一个统一的 sys_call_table 系统调用的操作码 fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read
crash 是 Linux 内核开发中流行的调试工具。特别是它提供了强大的使用搜索命令进行内存搜索的功能。但是,它有点不方便,因为在移动每个进程的调用堆栈时没有查看局部变量的功能。...vfs_read at ffffff800818add0 #8 [ffffffc87bbdbe50] vfs_read at ffffff800818bc38 #9 [ffffffc87bbdbe90] sys_read..., pos = 0xFFFFFFC87BBDBEC8) -009|SYSC_read(inline) -009|sys_read(?..., pos = 0xFFFFFFC87BBDBEC8) -009|SYSC_read(inline) -009|sys_read(?
---- Linux中常见的拦截过滤 本文着重介绍Linux平台上常见的拦截: 用户态动态库拦截。 内核态系统调用拦截。 堆栈式文件系统拦截。 inline hook拦截。...LSM(Linux Security Modules) ---- 动态库劫持 Linux上的动态库劫持主要是基于LD_PRELOAD环境变量,这个环境变量的主要作用是改变动态库的加载顺序,让用户有选择的载入不同动态库中的相同函数...在这里当发起read系统调用后,就会进入到sys_read,在sys_read中会调用vfs_read函数,在vfs_read的参数中正好有我们需要过滤的信息,那么就可以把vfs_read当做一个hook...第二种方式:Linux内核提供的kprobes机制。...---- LSM LSM是Linux Secrity Module的简称,即linux安全模块。是一种通用的Linux安全框架,具有效率高,简单易用等特点。原理如下: ?
发生的话,Linux实际向磁盘读取多少字节了呢?...要想把上面的两个问题搞的比较清楚,需要剖开Linux的内部来理解Linux的IO栈。...1 Linux IO栈简介 废话不多说,我们直接把Linux IO栈的一个简化版本画出来:(官方的IO栈参考这个:http://www.ilinuxkernel.com/files/Linux.IO.stack_v1.0...VFS提供的核心数据结构有四个,它们定义在内核源代码的include/linux/fs.h和include/linux/dcache.h中。...现在我们再从头整体过一下读取文件的过程 lib里的read函数首先进入系统调用sys_read 在sys_read再进入VFS里的vfs_read、generic_file_read等函数 在vfs里的
— 2 — 深入挖掘 Linux 内核的网络包处理过程 为了理解为什么问题会出现在 kube 节点服务的接收端,我们来看下 Linux 是如何处理网络包的。...在最简单原始的实现中,网卡接收到一个网络包以后会向 Linux 内核发送一个中断,告知有一个网络包需要被处理。...许多年前,Linux 新增了一个 NAPI,Networking API 用于代替过去的传统方式,现代的网卡驱动使用这个新的 API 可以显著提升高速率下包处理的性能。...现在我们可以使用一些工具来帮助我们实时追踪 Linux 内核的运行状态,为此我可以可以使用 bcc。...;do syscall_64;sys_read;...
分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间) 线程在Linux中的实现 《Linux内核设计与实现》第三版28页 线程在Linux就是一个普通的进程...进程 Linux中也称为task,是系统分配资源的基本单位 资源包括:独立的地址空间,内核数据结构(进程描述符…),全局变量, 数据段… Linux进程描述符:PCB (Process Control...Block),用于Linux的进程管理(线程有他的PCB) 僵尸进程 ps -ef |grep defunct (defunct表示无用的僵尸进程) 父进程产生子进程后,会维护子进程的PCB结构,子进程退出后...中是1457号线程) 调度策略 早期Linux 2.5 内核用的是Unix O(1)调度策略,按固定的时间片给程序 Linux内核2.6.23 采用CFS调度策略:Completely Fair Scheduler...注:eax 是32位的,ax是16位的 java中例子 java读网络 – jvm read() – c库read() - > 内核空间 -> system_call() (系统调用处理程序)-> sys_read
我们从 虚拟文件系统 开始跟踪 Linux 对 直接I/O 的处理过程。...读文件操作使用 read() 系统调用,而 read() 最终会调用内核的 sys_read() 函数,代码如下: asmlinkage ssize_t sys_read(unsigned int fd...ret = read(file, buf, count, &file->f_pos); } ... } return ret; } 由于 sys_read
我将以Linux下的同步Shell作为演示样例,因此我建议大家在阅读本文之前先阅读下面这几篇关于Shellcode的细节文章。...Shellcode: Linuxx86同步Shell汇编 Shellcode:Linux AMD64同步Shell汇编 Shellcode:Linux ARM同步Shell汇编 可能还需要查看关于加密算法的内容...下面的截图中显示的是一台Windows虚拟机发送给Linux虚拟机的部分命令,其中Linux平台运行的Shellcode是没有采用任何加密的。 ?...buf cdq ; edx = 0 mov dl, BUFSIZ ; edx = BUFSIZ push SYS_read...; eax = SYS_read pop eax int 0x80 ; encrypt/decrypt buffer pushad
#define SYS_fork 1 #define SYS_exit 2 #define SYS_wait 3 #define SYS_pipe 4 #define SYS_read...uint64 sys_mknod(void); extern uint64 sys_open(void); extern uint64 sys_pipe(void); extern uint64 sys_read...SYS_fork] sys_fork, [SYS_exit] sys_exit, [SYS_wait] sys_wait, [SYS_pipe] sys_pipe, [SYS_read...] sys_read, [SYS_kill] sys_kill, [SYS_exec] sys_exec, [SYS_fstat] sys_fstat, [SYS_chdir...syscall_names[] = { [SYS_fork] "fork", [SYS_exit] "exit", [SYS_wait] "wait", [SYS_pipe] "pipe", [SYS_read
为了简化利用,先构造调用SYS_read的shellcoed,然后借助它往堆上读执行execve("/bin/sh", NULL, NULL)的系统调用来getshell。...: for i in range(num): add(10, b"aaaaaaa") def exp(): #build shellcode ## call SYS_read
的内容读取到某地址中 -> 最后使用write函数打印出该地址的内容 然鹅,难点就在于我们要手写这段过程的汇编代码来读入程序中,具体系统调用方式可参考如下 函数名 EAX E**BX** ECX EDX Sys_read.../pwnable_orw" # 本地ELF libc_addr = "/lib/x86_64-linux-gnu/libc.so...fw == 32: return asm(shellcraft.sh()) elif fw == 64: return asm(shellcraft.amd64.linux.sh...subprocess.check_output(['one_gadget', '--raw','-f', filename]).split(' ')) #one_gg = one_gadget("/lib/x86_64-linux-gnu
领取专属 10元无门槛券
手把手带您无忧上云