linux kernal pwn 0ctf2018-zerofs

启动脚本

#!/bin/sh

stty intr ^]

qemu-system-x86_64 -enable-kvm -cpu kvm64,+smep,+smap -m 64M -kernel ./bzImage -initrd ./rootfs.cpio -append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet kaslr" -monitor /dev/null -nographic 2>/dev/null

init

#!/bin/sh

mknod -m 0666 /dev/null c 1 3
mknod -m 0660 /dev/ttyS0 c 4 64

mount -t proc proc /proc
mount -t sysfs sysfs /sys

cat /root/signature

echo 2 > /proc/sys/kernel/kptr_restrict
echo 1 > /proc/sys/kernel/dmesg_restrict

insmod /zerofs.ko

setsid cttyhack setuidgid 1000 sh

umount /proc
umount /sys

poweroff -f

主要就是凸显拒绝/proc/kallsymble泄露地址。
然后没有设置ptmx文件的权限
换言之就是能劫持tty结构体 能覆盖ptmx结构体。

在这里插入图片描述
看得出来逆向会非常的辛苦
在这里插入图片描述
看看函数我们应该能感受的出来
这显然长的很像一个文件系统。

我们要额外学习一些虚拟文件系统的知识。

“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作接口。

虚拟文件系统正是实现上述 Linux 特性的关键所在。虚拟文件系统(Virtual File System, 简称 VFS), 是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖VFS 共存,而且也依靠 VFS 协同工作。为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据结构;同时实际文件系统也提供 VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS层和内核的其他部分看来,所有文件系统都是相同的。

Linux虚拟文件系统四大对象:
•超级块(super block)
•索引节点(inode)
•目录项(dentry)
•文件对象(file)

超级块在每个文件系统的根上,描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。dentry用来实现名称和 inode之间的映射,dentry还维护目录和文件之间的关系,从而支持在文件系统中移动。文件对象描述的是进程已经打开的文件。因为一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象。但是由于文件是唯一的,那么inode就是唯一的,目录项也是定的。

我们知道一个文件系统的镜像,需要mount到目录上,才能使用。而mount是如何来识别这些文件系统的?这就靠驱动,register_filesystem将用户定义的文件系统注册,链接到系统维护的一个文件系统表上,mount遍历这张表,丛中取出对应的文件系统,并使用驱动里提供的一系列函数进行文件操作。

函数太多我们直接定位漏洞函数吧。
在这里插入图片描述
get_inode函数中是从文件系统镜像里去读取一个文件的inode,里面会记录文件大小等属性。
如果我们对文件里的size进行伪造,那么就可以造成溢出。

然后具体利用就跟klist那个题目一样。
利用溢出搜索到cred结构体
然后修改
提权。

exp写起来感觉好麻烦的样子
咕咕咕

大佬博客贴过来
可以去里面看看
ha1vk

### 编译树莓派Linux内核 #### 准备工作 为了成功编译树莓派的Linux内核,首先需要准备合适的开发环境以及必要的工具链。对于树莓派而言,推荐的方式是从GitHub仓库获取最新的内核源码并利用交叉编译工具来进行编译。 可以通过如下命令来克隆官方维护的Linux内核仓库至本地机器上的`Linux`目录中[^2]: ```bash sudo git clone https://github.com/raspberrypi/linux ~/linux-rpi ``` #### 配置内核选项 完成源码下载之后,进入所创建的工作目录,并通过菜单配置界面调整所需的内核特性设置: ```bash cd ~/linux-rpi make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` 上述指令中的`ARCH=arm`指定了目标架构为ARM处理器;而`CROSS_COMPILE=arm-linux-gnueabihf-`则定义了用于构建过程的前缀名,这通常对应于已安装好的交叉编译器路径。 #### 执行实际编译流程 当所有的预处理步骤完成后,就可以启动正式的编译操作了。考虑到整个过程中可能会消耗较多的时间资源,在此之前建议确认系统有足够的磁盘空间可用。 执行下面这条命令可以开始编译新版本的内核及其模块文件: ```bash make -j$(nproc) zImage modules dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` 这里的参数解释如下: - `-j$(nproc)`:自动检测CPU核心数并行化加速编译速度; - `zImage`:生成压缩后的可引导映像; - `modules`:一同打包驱动程序等附加组件; - `dtbs`:设备树二进制文件集合。 #### 安装更新后的内核及相关文件 一旦编译顺利完成,则需将产生的成果部署到SD卡当中以便后续加载应用。假设当前已经连接好存储介质并且挂载到了某个位置(比如/mnt/sdcard),那么继续按照下述方法操作即可实现目的。 先复制主要部分过去: ```bash sudo cp arch/arm/boot/zImage /mnt/sdcard/kernel7.img sudo cp arch/arm/boot/dts/*.dtb /mnt/sdcard/ sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/sdcard/overlays/ sudo cp arch/arm/boot/dts/overlays/README /mnt/sdcard/overlays/ ``` 接着把自定义过的模块也同步进去: ```bash sudo make INSTALL_MOD_PATH=/mnt/sdcard modules_install ``` 最后不要忘记卸载分区再安全移除硬件装置: ```bash sync && sudo umount /mnt/sdcard ``` #### 测试验证新的内核是否生效 插入含有最新版系统的microSD卡片回到主机板插槽里头,开机重启后可通过查看日志消息判断是否正确启用了预期之外的新内核版本。 ```bash dmesg | grep 'Kernel version' uname -a ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值