Linux内核与嵌入式C
文章平均质量分 96
操作系统与内核、嵌入式与 Linux C
江下枫
这个作者很懒,什么都没留下…
展开
-
CVE-2021-3493:Overlay 文件系统 Ubuntu 本地提权漏洞分析
由于笔者已分析过 CVE-2023-0386,在此基础上,分析 CVE-2021-3493 可能更为简单。CVE-2023-0386 需要理解OverlayFS、Linux 命名空间、SetUID 位的概念;除此之外,如果你想理解 CVE-2021-3493,还需要了解Capability、Linux 文件扩展属性。当你理解了这些常见的概念之后,在手动复现这些漏洞,会有更加深刻的理解,并且可以提高对 Linux 本地提权漏洞的认知。原创 2023-07-02 23:32:54 · 1801 阅读 · 0 评论 -
CVE-2023-0386:Overlay 文件系统 copy-up 本地提权漏洞分析
SUID 、文件系统挂载都是我们常见的提权方式,复现 CVE-2023-0386 可以让我们更好的认识 Linux 本地提权的途径,更好的了解 Linux 安全特性。再回到漏洞本身, 总结一下 CVE-2023-0386 利用的流程:① 创建 FUSE 文件系统,libfuse 允许我们以普通权限修改文件系统内任意文件属性,但是此文件系统被挂载为nosuid原创 2023-06-16 23:04:06 · 2933 阅读 · 0 评论 -
修改嵌入式 ARM Linux 内核映像中的文件系统
本文将演示如何在 32位 ARM zImage 中替换 piggy 中的文件系统,我们以 openWRT 的某个版本固件为例进行讲解。原创 2022-12-21 20:51:44 · 2358 阅读 · 0 评论 -
QEMU软件虚拟化-TCG源码分析
早在 QEMU 0.10.0 时代,TCG(Tiny Code Generator) 就已成为 QEMU 的翻译引擎。TCG 起源于 C 编译器后端,后来被简化为 QEMU 的动态代码生成器。实际上,TCG 和一个真实的编译器后端一样,负责分析、优化已经生成 Host 代码。原创 2022-04-04 23:00:19 · 5597 阅读 · 3 评论 -
Linux 文件属性及特殊权限详解
本篇博客不仅会介绍一些常用的属性,还会引申介绍一些容易被忽略的特殊权限。原创 2022-02-08 21:35:22 · 6460 阅读 · 0 评论 -
Glib 主事件循环轻度分析与编程应用
三个案例轻松搞定 glib 主事件循环原创 2021-05-17 22:13:41 · 2862 阅读 · 2 评论 -
从进程三状态到阻塞非阻塞,以及同步与异步
阻塞和非阻塞这里,先讲一下进程三状态,即运行(执行)、就绪和等待(阻塞)。上图 1 清晰的表明 Linux 典型的进程三状态。就绪:是指调度程序为该进程分配了除 CPU 以外的其他资源,只要时间片一到(占用 CPU 的进程释放 CPU 资源),进程就可以执行了运行(执行):顾名思义,进程正在执行阻塞(等待):由于等待事件发生而无法执行的事件被执行的进程。有许多事件会导致进程阻塞,例如...原创 2020-03-12 18:28:45 · 524 阅读 · 0 评论 -
Linux 内核中链表的定义和常见的操作
0x10 链表演化链表是内核中最常见的数据结构,也是其他数据结构的基础。和数组显著的区别是,链表无需占用连续的存储单元,在编译时,也不需要知道其长度,可以动态插入或者删除元素。下图是一个典型的双向链表图1 双向链表 1通过前驱和后继两个指针,就可以遍历整个链。如果打乱前驱和后继的关系,就形成了二叉树;如果设计更多的指针域,就可以构成各种复杂的数据结构;如果减少一个指针域,就形成单链表,如果...原创 2020-02-19 22:01:37 · 289 阅读 · 0 评论 -
另一角度看Android:Android 系统架构与 Linux 对比分析
0x0 写在前面Android 系统对我们快速进入移动互联网时代带来了卓越的贡献。其基于 Linux 开源而来,2005年8月由 Google 收购注资,2008年谷歌发布了第一款搭载安卓系统的智能手机,日后更加证明这一举动的深远影响。0x1 Android “伪”架构不论是在 Google 官网,还是在各大社区论坛,如果你搜索 Android Architecture,即安卓架构,相信都会...原创 2020-02-18 21:50:36 · 2121 阅读 · 0 评论 -
从分段与分页原理到 Linux 虚拟内存映射机制
对于普通程序员来说,使用 objdump 或者其他工具查看到的程序的内存地址其实都是虚拟地址,并不是真实的物理地址,在《操作系统原理》课程中,我们可能也学到了一些内存映射机制,但是都是从抽象层面去分析操作系统的内存管理。本文不仅介绍一些基本原理,而且使用实际的 Linux 内核实例化我们所学到的原理,更加直观和简洁。1 基本概念物理地址:就是插在主板上的内存条上的位置,32 位操作系统通常支...原创 2019-06-08 18:34:04 · 763 阅读 · 0 评论 -
编写一个遍历进程的内核模块
本节主要编写一个内核模块,实现进程PID和名称的打印。这里,我们需要了解linux内核中,链表的实现、PCB(进程控制块)的定义。编程不是目的,目的是更加了解内核中相关代码的实现。至于如何编写和运行一个模块,请参考:在Ubuntu 18.04环境下编写一个简单的内核模块模块源码# include<linux/module.h># include<linux/kernel.h...原创 2018-11-08 13:33:12 · 3767 阅读 · 0 评论 -
在Ubuntu 18.04环境下编写一个简单的内核模块
我们首先来看看内核模块的定义。模块是具有独立功能的程序,可以单独编译,但是不能单独运行。模块在运行时,会被链接到内核,作为内核的一部分在内核空间运行。模块通常由一组函数和数据结构组成,用来实现一种文件系统、驱动程序或其他内核上层的功能。实验环境:Ubuntu 18.04 + 4.15.0编写模块#include<linux/module.h>#include<l...原创 2018-10-10 12:43:17 · 10024 阅读 · 2 评论 -
如何追踪 IoT 设备进程空间的数据流及其相关调用栈
数据从外界传输 IoT 设备,到底要经过哪些进程,经过哪些函数,一旦知道数据流经过的函数,就知道程序处理数据的逻辑,就很有可能从中发现漏洞。本次就来讲讲如何追踪嵌入式设备的数据流。原创 2020-04-15 22:18:37 · 669 阅读 · 3 评论 -
通过gdb移植搭建arm单板交叉调试环境
对于嵌入式开发来说,嵌入式开发板经常需要使用 gdb 进行源码级调试,或者对于安全测试人员来说,也需要使用 gdb 进行二进制程序的调试。gdb 交叉调试提供了这样的环境,可以在目标单板上启动 gdbserver 进程,本地主机使用 gdb 作为客户端连接。为了更好的调试程序,远程单板和本地主机的 gdb 最好统一版本。这里使用源码编译的方式,编译出客户端程序 arm-linux-gdb 和服务端程序 gdbserver。常见的配置选项有以下几种--host:指定了编译后的程序需要在哪里运行--ta原创 2020-05-29 21:54:40 · 1655 阅读 · 1 评论 -
沧海桑田:Linux 系统启动的演进模型与发展变化
Linux 系统启动过程在不断演进和变化,从最初的 SysV init,到如今的 Systemd 初始化进程,Linux 早已发生了翻天覆地的变化。旧时的 SysV init 启动方式已逐渐退出历史舞台,Upstart 也曾大行其道,作为后起之秀的 Systemd 发展迅速,并在 2020 年成为 Linux 启动的主流 init。原创 2020-05-12 22:05:24 · 741 阅读 · 0 评论 -
initramfs 在内核中的作用与实现
initramfs 作为根文件系统一个重要补充,在特定条件下弥补了内核启动时,没有用户态的缺陷。很多 Linux 发行版都使用了 initramfs,当然也有一些并没有使用,该 ram 文件系统并非必须,但在很多场景下又不可或缺。例如 Kali Linux 系统,就使用了 initramfs。本文首先讲述了 initramfs 的由来和工作过程,然后举了一个实际的例子,以将抽象的过程具体化,最后使用 qemu 启动了我们制作的 initramfs,相信通过此文,你一定能够对 initramfs 有一个更加清原创 2020-05-10 12:38:51 · 16626 阅读 · 5 评论 -
为 QEMU ARM 仿真器编译 Linux 内核:QEMU 模拟 ARM 环境
本文主要讲述如何编译符合 qemu 要求的内核,使用 qemu 成功运行内核。我们需要在 Linux 环境下安装交叉编译工具链,用于在 x86 平台上编译 arm 架构的内核;也要解决其中的依赖问题;如果有需要,还要升级系统自带的 qemu(如果自带版本较高,可以不用重新安装)。如果能够成功的运行内核,后续还可以在 qemu 模拟的环境中,挂在相应的根文件系统,这样就可以完整的运行一个 arm 架构的 linux 系统。原创 2020-04-28 21:56:49 · 4562 阅读 · 0 评论 -
Linux 内核与用户空间的数据交互
本文以 IBM M. Jones 所著文章为雏形,更正了部分翻译术语,并增加了内存管理的内容,从宏观上讲述 Linux 内核与用户空间隔离的原因,为什么出现了相应的访问 API,大体上介绍内核与用户空间访问的一般模型。原创 2020-04-17 22:38:52 · 1501 阅读 · 1 评论 -
交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装
aarch64-linux-gnu-gcc 是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具原创 2020-04-13 21:52:32 · 90045 阅读 · 11 评论 -
从汇编角度理解 ebp&esp 寄存器、函数调用过程、函数参数传递以及堆栈平衡
本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是如何进行参数的传递。如果你细读此文,相信一定会有所收获。原创 2020-04-04 14:17:07 · 11216 阅读 · 6 评论 -
ARM 中的 TrustZone 与 Exception Levels
TrustZoneTrustZone 是 ARM 针对消费级的电子设备,设计的一种硬件架构,目的在于为消费电子产品构建一个安全框架从而抵御各种潜在的攻击。TrustZone 将 SoC (System-on-a-Chip) 硬件和软件划分为 Normal world 和 Secure world 两部分。一些敏感操作,例如加解密、生物识别技术、安全认证等,需要在 Secure world 执行,...原创 2020-03-29 12:48:01 · 732 阅读 · 0 评论 -
深入浅出:Linux C编程中如何使用动态链接库
在一些大型项目的开发中,代码复用是很常见的情况,各个模块经常会使用一些通用功能。为了提高代码质量,减少代码冗余,一般会引入公共的模块库,将通用函数写入其中。动态链接库就是这样的一个公共的模块库,它不仅可以降低模块之间的耦合,还可以将其发布出去,供他人使用。0x10 动态链接库的生成和使用动态链接库只是一些函数的实现,供第三方调用。从宏观角度上来说,需要以下两个文件头文件,主要是函数的一些声...原创 2020-03-18 21:51:02 · 3541 阅读 · 1 评论 -
设备驱动与 ioctl 函数详细分析
类 UNIX 操作系统将所有设备都看成文件每个设备都对应一个文件,在内核中也有一个相应的索引结点对文件操作的系统调用也适用于对设备文件的操作,例如 open()设备文件逻辑空间是一个线性空间ioctl 是设备驱动程序中对设备的 I/O 通道进行管理的函数,简言之就是对设备的一些特性进行管理,例如传感器的数据采集、串口波特率等等。上图1清晰的表明了 ioctl 在各个层之间的调用关系...原创 2020-03-14 20:36:09 · 2152 阅读 · 2 评论