Kernel环境配置

linux kernel 动调

Posted by Matrixtang on March 20, 2020

kernel环境配置


为了调试kernel而配置的kernel调试环境

之前学习kernel pwn的时候有配置过kernel环境,而理解kernel机制也需要去动态调试

编译内核

研究内核机制,除了查看资料阅读源码,还可通过调试器,动态分析内核执行流程。

编译调试版内核

make menuconfig
Kernel hacking  ---> 
    [*] Kernel debugging
    Compile-time checks and compiler options  --->
        [*] Compile the kernel with debug info
        [*]   Provide GDB scripts for kernel debugging
make -j #两倍你核数
make bzImage #创建镜像

构建initramfs根文件系统

利用Busybox构建

编译BusyBox,配置CONFIG_STATIC参数,编译静态版Busybox

cd busybox # DIR of busybox
make menuconfig
Settings  --->
    [*] Build static binary (no shared libs)

把_install文件放入initranfs中

mkdir initramfs
cp ../_install/* -rf ./ #包括基本根系统
mkdir proc
mkdir sys
touch init
chmod +x init

在这个文件系统中可以包含任意的ko文件

修改init文件加入

#!/bin/sh
echo "{==DBG==} INIT SCRIPT"
mkdir /tmp #挂载
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
# insmod /xxx.ko # load ko 
mdev -s # We need this to find /dev/sda later
echo -e "{==DBG==} Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 1000 /bin/sh #normal user
# exec /bin/sh #root 
echo "FINISH"

打包脚本

#!/bin/sh
echo "Generate rootfs.img"
cd busybox # fs folder
find . | cpio -o --format=newc > ../rootfs.img

启动脚本

#!/bin/sh
echo "system start!"
qemu-system-x86_64 \
-s \ # 监听1234端口 -gdb tcp::1234的缩写
-kernel\
/path/to/bzImage \
-initrd /path/to/rootfs.img \ 
-nographic -append "console=ttyS0"

获取当前进程

Linux内核从2.6引入了Per-CPU变量,获取当前指针也是通过Per-CPU变量实现的

The current task is saved in per-cpu space for x86-64 and is accessed through the gs register at current_task offset as

mov    %gs:0xd440,%rdx

getting a task running on a CPU

(gdb) p $lx_per_cpu("current_task").pid

通过内核模块添加系统调用

参考链接

使用QEMU和GDB调试Linux内核

kernel环境配置

Kernel Debugging Tips