Linux内核
文章平均质量分 70
Linux内核分析与实战
暂转载自《Linux内核源代码情景分析》
原文链接:https://zhuanlan.kanxue.com/user-center-815036基于Linux-2.4.0内核代码书写,分析内核中最核心的一些模块:内存管理、中断、进程管理、文件系统、驱动、系统引导等。
北观止
欢迎留言讨论,期待与你共同进步
展开
-
走进Linux内核之XFRM框架
笔者此前对Linux内核相关模块稍有研究,实现内核级通信加密、视频流加密等。下面开始上才艺,带你走进Linux内核之XFRM框架。原创 2021-09-21 14:26:40 · 3115 阅读 · 0 评论 -
走进Linux内核之Netfilter框架
笔者此前对Linux内核相关模块稍有研究,实现内核级通信加密、视频流加密等。话不多说直接上才艺,现在带你走进Linux内核之Netfilter框架。原创 2021-09-21 14:24:06 · 585 阅读 · 0 评论 -
Linux加密框架设计与实现
本文转自网络文章,内容均为非盈利,版权归原作者所有。转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。原文作者:原文作者是独孤九贱大神原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html...转载 2021-01-08 23:07:01 · 152 阅读 · 0 评论 -
Linux内核的加密函数框架
本文转自网络文章,内容均为非盈利,版权归原作者所有。转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。原文作者:richardhesidu原文地址:http://bbs.chinaunix.net/thread-1984676-1-1.html...转载 2021-01-08 23:05:27 · 1113 阅读 · 0 评论 -
Linux内核笔记009 - 中断、异常、陷阱、Bottom half、信号
1. 中断本质:保存当前执行现场+触发指令跳转 记得刚学习C语言时,只要找个包含if语句的程序,然后通过理解整个程序执行到这条语句时,发生了什么,自然就明白if语句的作用了。同样,为了理解"中断"的含义,我特别建议站在可以看见整个系统的角度,去看出现中断时,整个系统这个"大程序"是如何执行的。 时钟中断(硬件触发,对于软件是被动的)、异常(软件缺页、除0bug等情况无意触发)、陷阱(软件显式执行int指令触发)出现时,都会穿过一道"门",跳转到内核在"门"中设置的指令地址处执行,所以它们...转载 2020-10-13 21:38:24 · 1045 阅读 · 0 评论 -
linux-5.6.6 内核引导
本文详细讲解linux内核的加载过程,参考linux-insiders,并结合linux-5.6.6代码对原文的部分老旧内容做修改引导1.按下电源开关后, CPU设置寄存器为预定值,程序在实模式下运行,程序首先执行0xfffffff0(映射至ROM)处内容,此处为复位向量,直接跳转至BIOS。2.BIOS初始化,检查硬件,寻找可引导设备,跳转至引导扇区代码(boot.img)寻找可引导设备方式: 定位MBR分区, 引导扇区存储在第一个扇区(512字节)的头446字节处。引导扇区以0x5.转载 2020-12-23 20:50:51 · 593 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- 任意读写(四)
hijack_modprobe_path篇原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermodehelper(char *modprobe_path ...) 修改modprobe后,即可实现root权限任意命令执行 攻击流程 (内核任意读写漏洞)内核修改全局变量 modprobe_path为目标指令 写入错误格式elf文件,并手动执行,触发 原文地址一. 利用步骤1. 定位modprobe_path(开启kaslr转载 2020-12-23 20:52:08 · 292 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- 任意读写(三)
hijack_prctl篇 prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统调用 内核接收参数后执行security_task_prctl security_task_prctl执行hook.task_prctl poweroff_work_func函数: 内核函数,执行 run_cmd(poweroff_cmd),即root权限执行poweroff_cmd 攻击流程: 劫持hook.task_转载 2020-12-23 20:51:58 · 299 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- 任意读写(二)
hijack_vdso篇 vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改,那么用户态空间的vdso也会同步被修改 攻击流程 (内核任意代码执行漏洞)内核调用set_memory_rw 函数修改内核vdso页面属性,使得用户态可以直接修改vdso,劫持vdso为shellcode,触发条件同1 (内核任意读写漏洞)内核修改内核vdso数据,写入shellcode,使得用户态vdso中函数被劫持,当高权限进程调用v转载 2020-12-23 20:51:48 · 274 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- 任意读写(一)
cred篇每个线程在内核中都对应一个线程结构块thread_info thread_info中存在task_struct类型结构体 struct task_struct中存在cred结构体用来保存线程权限 攻击流程 定位某进程的cred结构体 将cred结构提结构体的uid~fsgid全部覆写为0(前28字节) 原文地址一. 利用步骤1. 定位cred结构体 task_struct中存在char comm[TASK_COMM_LEN] co.转载 2020-12-23 20:51:38 · 436 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- ROP(二)
ret2usr CR4篇 smep: smep是内核的一种保护措施, 使得内核不可执行用户态代码 内核通过CR4寄存器的第20位来控制smep, 第20位为0时,smep被关闭 攻击流程 提前在用户态代码中构造进程提权代码(get_root) ROP技术修改CR4第20位数据为0(关闭smep), 通常使用 mov cr4, 0x6f0 修改 rip 直接指向用户态提权代码,实现进程提权 原文地址一. 判断是否开启smep1.查看 boot.shqemu转载 2020-12-23 20:51:25 · 329 阅读 · 0 评论 -
linux 内核提权总结(demo+exp分析) -- ROP(一)
基础ROP篇(linux 5.0.21)内核提权与用户态攻击的区别攻击流程 用户态攻击: 执行 system("/bin/sh") 获得shell 内核提权: 内核执行 commit_creds(prepare_kernel_cred(0)) 使进程获得root权限 用户态进程执行system("/bin/sh") 获得root权限 shell 原文地址理解难点 内核rop链构造 用户态进程与内核之间的切换 一. 漏洞分析建议初学者先了解基础的驱动程序转载 2020-12-23 20:51:10 · 1569 阅读 · 0 评论 -
Linux内核笔记008 - 中断的概念及硬件支持
1. 概念了解 有时候,应用程序开发的经验,很容易使我们的视野,停留在单个进程中,反而阻碍理解。我的方法是,把整个系统看成一个"大程序",这个程序最开始只有内核部分,随着执行,它又动态加载了一些指令和数据,作为自身的"生长部分",也就是说,把"进程"理解为整个"大程序"的"生长部分"。这样理解的好处是,会让视野从单个进程中走出来,从而才能看得清整个系统的运行逻辑: ① 任何时刻,这个"大程序"只有一条指令在被CPU执行。 ② 系统启动阶段,从内核的代码开始执行,内核运行过程...转载 2020-10-13 21:38:13 · 1087 阅读 · 0 评论 -
Linux内核笔记007 - 内存管理的进一步封装
内存管理学习到现在这个阶段,虽然内容又长又抽象,但其实仅仅才是整个高楼大厦中埋在地里的那部分,包括: Linux内核笔记001、Linux内核笔记002,说明了Intel 80386 CPU为内存管理提供的硬件特性;Linux内核笔记004、Linux内核笔记005、Linux内核笔记006,说明了Linux内核按"页面"为单位,对各个进程的虚拟内存空间、对整个系统的物理内存空间和交换分区的基础管理。而实际应用场景,需要利用这些最基础的方式,封装更多的内存管理方式。 根据我个人的总结,实...转载 2020-10-13 21:38:02 · 375 阅读 · 0 评论 -
Linux内核笔记006 - 交换分区
1. 交换分区概念 一个cpu,同一时刻只能执行一条指令,执行某个进程时,其它进程一定是停止状态。那么,当cpu切换到进程B运行时,如果系统中已经没有空闲的物理内存页面了,内核就会选择一个其它进程占用的物理内存页面,将其内容备份到磁盘上,这样就可以先腾出来给当前正在运行的进程B使用了,这个过程叫做"页面换出",当切换到进程A运行时,再重新分配一个物理内存页面(如果也没有空闲物理内存页面,同样执行换出操作),并且从磁盘上恢复换出的内容,这个过程叫做"页面换入"。用于备份内存数据的磁盘空间,就是"交换..转载 2020-10-13 21:37:50 · 765 阅读 · 0 评论 -
Linux内核笔记005 - 越界访问内存,Linux内核处理过程
1. 几个重要的数据结构和函数内存管理本质 在Linux内核笔记004中,已经引出了"分配"的概念,它本质上就是在保护模式下,做两件事: ① 隔离同一进程已使用和未使用虚拟内存空间,以及整个系统的已使用和未使用物理内存空间 具体实现:记录已每个进程已使用的虚拟地址,和整个系统已使用的物理地址,分配时使用未使用的。 ② 隔离不同进程的用户空间 具体实现:为每个进程0-3G范围的虚拟地址,建立独立的映射,...转载 2020-10-13 21:37:39 · 1592 阅读 · 0 评论 -
Linux内核笔记004 - 从内存管理开始,认识Linux内核
1. 系统初始化 Linux内核笔记001、Linux内核笔记002、Linux内核笔记003,对应的是《Linux内核源代码情景分析》第一章内容,在进入第二章学习之前,本篇笔记先跳跃到第10.1节——系统初始化(第一阶段):实模式 内存是挥发性的存储介质,断电后,数据就没有了,相应的,开机时,是通过"烧"在不挥发存储介质上的初始引导程序(比如BIOS程序),将内核程序从磁盘引导区读入内存的。在内核被加载到内存后,指令就会从BIOS跳转到内核代码开始执行,这时CPU还是实模式状...转载 2020-10-13 21:37:27 · 369 阅读 · 0 评论 -
Linux内核笔记003 - Linux内核代码里面的C语言和汇编语言
1. Linux内核中的C语言 Linux内核是用GNU C编写,从而必须用gcc编译,另外gcc编译器在发展过程中,在不断的扩展和舍弃一些东西,所以就会出现一种情况:高版本gcc编译不了低版本内核、低版本gcc也编译不了高版本内核。所以在编译内核时,一定要使用跟内核版本差不多时期的gcc版本。带返回值的宏函数#include <stdio.h>#define FUN() ({ \ int ret = 100; \ printf("do somethi...转载 2020-10-13 21:37:11 · 797 阅读 · 0 评论 -
Linux内核笔记002 - i386 的页式内存管理机制
1. 虚拟地址只要不是实际内存的地址,都是虚拟地址,通常就是指逻辑地址,逻辑地址是指指令中的地址,比如写一个下面这样的程序#include <stdio.h> static char ch = 'A'; int main(){ printf("%p, %c\n", &ch, ch); return 0;}执行"gcc test.c -g -Wall",然后执行"objdump -S a.out",查看main()函数的反编译结果:int .转载 2020-10-13 21:36:42 · 279 阅读 · 0 评论 -
Linux内核笔记001 - Intel X86 CPU 系列的寻址方式
1. 段寄存器 上图是Intel X86系列的CPU,在Pentium之前的发展过程:4004:8位CPU 8086~80286:16位CPU,即逻辑运算单元(ALU)的位数为16,但地址总线为20位,另外80286开始支持保护模式,但只支持实模式到保护模式的单向切换 80386:32位CPU, ALU为32位,地址总线也设计成32位了 我有个自我认识,就是在学习的时候,比较喜欢钻牛角尖,比如我就为这些问题纠结过:8086为什么要把地址总线设计成20位? 地址总线...转载 2020-10-13 21:36:15 · 609 阅读 · 0 评论