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 thegs
register atcurrent_task
offset asmov %gs:0xd440,%rdx
getting a task running on a CPU
(gdb) p $lx_per_cpu("current_task").pid