CTF中内核类题目附件说明

CTF比赛中的内核题目通常会由以下几部分组成:

  • qemu-system 启动脚本(通常叫start.sh或者boot.sh)
  • rootfs.cpio 虚拟机的文件系统
  • bzImage 内核镜像

qemu-system 启动脚本

用于启动内核虚拟机的shell脚本,因为qemu是通过参数控制配置信息的,参数较多,所以会提供脚本。下面来分析一每个参数的意义:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

qemu-system-x86_64 \
-initrd rootfs.cpio \ # 使用 rootfs.cpio 作为内核启动的文件系统
-kernel bzImage \ # 使用 bzImage 作为 kernel 映像
-append 'console=ttyS0 root=/dev/ram oops=panic panic=1' \ # 配置信息 (开启kaslr会写在这)
-enable-kvm \ # 使用 KVM 进行加速
-monitor /dev/null \
-m 64M \ # 设置运行内存为64M
--nographic \
-smp cores=1,threads=1 \# 设置 CPU 配置 单核单线程
-cpu kvm64,+smep # 设置 CPU 的安全选项,这里开启了 smep

rootfs.cpio 虚拟文件系统

由cpio打包而成的文件,通常还会用gzip压缩一次。下面介绍一下cpio命令:

打包

1
find . | cpio --null -ov --format=newc > rootfs.cpio

参数说明:

  • –null 解析空字符串’’\0’
  • -o:(–create)指定运行为copy-out模式,即归档模式
  • -v:给出详细信息
  • -H FORMAT, –format=FORMAT 使用归档格式 FORMAT。

解包

1
cpio -idmv < core.cpio

参数说明:

  • -i:(–extract)指定运行为copy-in模式,即提取模式
  • -d:(-make-directories)当需要的时候自动创建目录
  • -m:(–preserve-modification-time)保留文件的原始mtime
  • -v:给出详细信息

解包出来的文件会包含一个”.ko”格式的文件,这个文件就是我们需要pwn掉的内核模块!

还会包含一个init文件,是系统开机时的初始化文件。我们可以关掉poweroff命令的定时关机,否则可能会影响到我们调试,在有必要时还可以将权限改成root方便调试。

bzImage内核镜像

里面包含了编译好的内核 vmlinux,可用extract-vmlinux 脚本进行提取

1
2
3
4
5
6
7
ssta@E4x:/pwn/kernel/ciscn2017_babydriver/test$ ls
bzImage extract-vminux.sh
ssta@E4x:/pwn/kernel/ciscn2017_babydriver/test$ ./extract-vminux.sh bzImage > vmlinux
ssta@E4x:/pwn/kernel/ciscn2017_babydriver/test$ ls
bzImage extract-vminux.sh vmlinux
ssta@E4x:/pwn/kernel/ciscn2017_babydriver/test$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=e993ea9809ee28d059537a0d5e866794f27e33b4, stripped

vmlinux中可以提取出解题需要的gadgets