qwb 2018 core
年轻人的第一个内核题目。
环境搭建
基础
解包:
# /bin/sh
mv core.cpio core/core.cpio.gz
cd core
gunzip core.cpio.gz
cpio -idm < core.cpio
rm core.cpio
重打包:
# /bin/sh
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > core.cpio
mv core.cpio ../core.cpio
注意修改启动脚本,内存给的大一点才能启动
qemu-system-x86_64 \
-m 128M \
-kernel ./bzImage \
-initrd ./core.cpio \
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet kaslr" \
-s \
-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \
-nographic \
修改init脚本
由于默认是chal权限,内核地址信息等看不到,所以还要修改脚本进入root进行调试。
修改这两个位置,第一个是取消定时关机,第二个是设置默认权限为root。
重新打包以后才生效。
调试
启动脚本里已经有了-s
选项。于是可以直接使用gdb去连上去。
target remote :1234
在内核中我们使用 lsmod
可以查看到模块加载地址,于是可以直接下断点, 进行调试。也可以使用符号, 通过以下指令载入符号即可。
add-symbol-file module_path base_address
因为基本是在驱动模块的漏洞利用,这样也差不多了。
漏洞
从文件中拖出来 core.ko
文件,逆向, 可以看到通过ioctl如何操作。
整数截断-栈溢出
这个位置存在一个整数截断导致的栈溢出。
而name这个数据在这个位置, 我们可以通过write直接写入。
数据泄漏
这里可以向用户态写入数据,
通过ioctl可以直接修改这个off,
利用
利用也比较简单,
程序内有canary, 运行有kaslr, 于是我们要先泄漏canary、内核地址、驱动地址。
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include