初识 KernelPWN
Kernel UAF-babydriver
现在处于一种并不了解 KernelPWN 的现状,这篇文章主要是根据已知文件和 exp 了解解题步骤,为后续打基础
利用 exp 解一道题目的过程:
在/home/kali/Desktop/give_to_player 有一道内核pwn ,这个可以自行去寻找文件
在该文件夹中有下面这些文件 bzImage rootfs.cpio boot.sh babydriver.ko exp.c

- bzImage – Linux 镜像文件,是编译出来的 Linux 内核二进制文件, 负责管理 CPU、内存 、硬盘以及所有的硬件交互。
- boot.sh – Qemu 启动脚本,启动配置文件,通常是一个 Shell 脚本,用来调用 Qemu 虚拟机并传入复杂的参数。
- rootfs.cpio – gzip 压缩的文件系统, 初始文件系统 是一个精简的虚拟磁盘文件。通常包含
/bin、/etc、/lib等基础目录,以及一个最重要的启动脚本init。
静态编译 exp.c:
1 | gcc -static -masm=intel exp.c -o exp |

解包文件系统 (rootfs):
我们需要把刚才编译好的 exp 放进题目的文件系统里。因为它是 .cpio 格式,我们需要先把它解开。
在题目目录下执行以下命令:
1 | # 1. 创建一个空目录用来存放解包后的文件 |
现在,fs_extract 目录下应该有 bin, etc, init 等 Linux 标准目录,以及你的 exp。
重新打包文件系统:
把加入了 exp 的目录重新打包成 .cpio 文件替换掉原来的。
在 fs_extract 目录下执行:
1 | # 将当前目录下的所有文件打包成新的 rootfs.cpio,放在上一层目录 |

修改 boot.sh:
1 | nano boot.sh # 去除 -enable-kvm |

运行 boot.sh:
1 | ./boot.sh |
运行 exp 进行提权:

GDB 调试 kernelPWN
提取 vmlinux
1 | #┌──(pwn_env)─(root㉿kali)-[/home/kali/Desktop/boot] |

终端 A(QEMU 窗口): 执行那个带调试参数的命令(确保有 -s -S),让它卡住:
1 | qemu-system-x86_64 \ |

终端 B (GDB 调试器):
1 | # 启动 GDB |
QEMU 内部 (查地址):
1 | / $ cat /proc/kallsyms | grep prepare_kernel_cred # 获取内核函数地址 |
GDB 内部 (设断点):
1 | # 1. 强制加载文件(解决 No symbol table 报错) |
此时回到 QEMU 窗口 运行 ./exp。当断点命中,回到 GDB 窗口 操作:
1 | # 查看当前所有寄存器 |


更新: 2026-05-09 19:01:43
原文: https://www.yuque.com/idcm/wnemg9/yw8gxitphmwsup3w