前言(刚开始学,这篇文章会慢慢写。)
关于Linux kernel的知识点我不想写了,自己可以去看CTF Wiki。或者大佬的博客
环境搭建:
- Ubuntu20,我这里用的是ctfshow的Ubuntu。
- busybox,我用的是 busybox-1.36.1.tar.bz2
- Linux内核, 这里更具自己的pwn题下载对应版本的就行了。
- qemu,
apt install qemu qemu-system qemu-user
对于busybox。下载解压完后进入busybox文件夹。
(无关内容: 我kali busybox编译安装一直失败,只能换Ubuntu了)
make menuconfig
然后配置busybox。
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
之后退出保存就行。然后编译安装就完事了。
make install
出现这个说明成功。然后在文件下面有个 _install 文件夹。这样就成功了。
之后可以在 _install 目录下打包整个文件系统
find . | cpio -o --format=newc > ../../rootfs.img
或者
find . | cpio -o --format=newc > ../../rootfs.cpio
对于LInux 内核 下载地址是:Linux 内核下载地址
我下载的是linux-4.4.72.tar.gz。
实战分析(部分)
准备
这里以CISCN_2017_babydriver为例
下载地址为: CISCN_2017_babydriver,例题在Kernel专题中。
把压缩包文件复制到虚拟机。
解压
tar -xvf babydriver.tar
解压,提取文件系统:
mv ./rootfs.cpio ./rootfs.cpio.gz
gunzip rootfs.cpio.gz
cpio -idmv < rootfs.cpio
然后更改init使其方便以root运行。
strings bzImage |grep gcc
file bzImage
之后下载Linux内核
这里选择的Linux 内核版本就是 4.4.72。gcc对应的版本是ubuntu16.04。等一下编译时就要用这个版本。
进入linux-4.4.72文件夹
make menuconfig
这里不需要配置,直接退出就行。如果报错或者依赖包有问题可以自己百度,我还没遇到过。就不写了
之后make bzImage
如果报错 canonical-certs.pem:
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
执行scripts/config --disable SYSTEM_TRUSTED_KEYS
如果报错 canonical-revoked-certs.pem:
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
执行
scripts/config --disable SYSTEM_REVOCATION_KEYS
这里编译完后主要关注以下两个文件:
:
bzImage :arch/x86/boot/bzImage
vmlinux:源码所在的根目录下
启动内核
因为之前我们已经下载好了CISCN2017_Pwn_babydriver这个题目,然后我们进入这个题目文件夹。编辑一个start.sh来启动内核
#!/bin/sh
qemu-system-x86_64 \
-m 64M \
-nographic \
-kernel ./bzImage \
-initrd ./rootfs.cpio \
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 kaslr" \
-smp cores=2,threads=1 \
-cpu kvm64
然后给一个执行权限.
chmod +x ./start.sh
运行之后如下图:
如果想关闭内核地址随机化的话如下改start.sh
#!/bin/sh
qemu-system-x86_64 \
-m 64M \
-nographic \
-kernel ./bzImage \
-initrd ./rootfs.cpio \
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 nokaslr" \
-smp cores=2,threads=1 \
-cpu kvm64
手动安装符号表
运行我们的start.sh
find /sys/ | grep babydriver
大部分函数都可以在 .text 中找到
然后运行下面命令就可以查看.text的基地址(这里要关闭内核地址随机化。)
/ $ cat /sys/module/babydriver/sections/.text
0xffffffffc0000000
/ $