0%

kernel environ

kernel environ

手工搭建内核

qemu

轻量级虚拟化设备,我们主要使用 qemu-system- 系列

1
➜  ~ apt-get install qemu  

busybox

轻量级文件系统,适用于 kernel 开发

输入以下网站获取 busybox:

1
https://busybox.net/downloads/
  • .tar.gz 格式解压为 tar -zxvf xx.tar.gz
  • .tar.bz2 格式解压为 tar -jxvf xx.tar.bz2

输入以下指令配置文件:

1
➜  make menuconfig
1
2
3
4
5
6
7
8
9
10
11
│ ┌↑(-)─────────────────────────────────────────────────────────────────┐ │  
│ │[ ] Support NSA Security Enhanced Linux (NEW) │ │
│ │[ ] Clean up all memory before exiting (usually not needed) (NEW) │ │
│ │[*] Support LOG_INFO level syslog messages (NEW) │ │
│ │--- Build Options │ │
│ │[ ] Build static binary (no shared libs) (NEW) // target │ │
│ │[ ] Build position independent executable (NEW) │ │
│ │[ ] Force NOMMU build (NEW) │ │
│ │[ ] Build shared libbusybox (NEW) │ │
│ │() Cross compiler prefix (NEW) │ │
│ │() Path to sysroot (NEW)

在“Build static binary”处按“Y”选中(采用静态编译,为了不添加动态链接库)

直接退出,退出时保存,接下来就是busybox编译了:

1
2
➜  make -j4    
➜ make install

这个“_install”就是编译好的文件了,输入以下指令:(复制 rootfs )

1
➜  cp rootfs -r ..

_install 目录下创建以下文件夹

1
2
3
4
➜  mkdir proc
mkdir sys
touch init
chmod +x init

init 为 linux 的初始化脚本,内容为:

1
2
3
4
5
6
7
8
#!/bin/sh
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
mdev -s # We need this to find /dev/sda later
setsid /bin/cttyhack setuidgid 1000 /bin/sh

创建 pack.sh 作为 linux 的打包脚本,内容如下:

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

创建 start.sh 作为 linux 的启动脚本,内容如下:

1
2
3
4
5
6
7
8
9
#!/bin/sh
qemu-system-x86_64 \
-m 64M \
-nographic \
-kernel ./bzImage \
-initrd ./rootfs.img \
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 kalsr" \
-smp cores=2,threads=1 \
-cpu kvm64

kernel pwn

一般的 kernel pwn 都有三个文件

1
2
3
boot.sh (启动脚本 - ".sh")
bzImage (内核 - "bzImage")
initramfs.cpio (内置的busybox文件系统 - ".cpio")

在busybox文件系统中就会有对应的驱动文件

1
pwn.ko (驱动文件 - ".ko")

用 file 指令获取目标内核的信息

1
2
➜  babykernel file bzImage
bzImage: Linux kernel x86 boot executable bzImage, version 4.19.26 (bird@ubuntu18) #2 SMP Tue Jun 4 18:57:49 CST 2019, RO-rootFS, swap_dev 0x8, Normal VGA

在 kernel 官网上下载对应版本的内核

1
https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ 

然后观察它是用什么编译器编译出来的(gcc版本会影响编译)

1
2
3
➜  babykernel strings bzImage | grep gcc
yygcc3s!
4.19.26 (bird@ubuntu18) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04)) #2 SMP Tue Jun 4 18:57:49 CST 2019

输入以下指令配置文件:(直接退出,默认就好)

1
➜  make menuconfig 

在进行 kernel 编译之前要进行 gcc 版本替换

1
2
3
4
5
ls -l /usr/bin/gcc*
sudo apt-get install -y gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --config gcc
gcc -v

接下来就是 kernel 编译了(通过“-jn”来指定线程数)

1
➜  make bzImage -j4
  • bzImage:arch/x86/boot/bzImage
  • vmlinux:源码所在的根目录下

下载现有内核

使用如下命令列出可下载内核镜像

1
sudo apt search linux-image-

选一个自己喜欢的下载就行,笔者所用的阿里云源似乎没有最新的5.11的镜像,这里用5.8的做个示范:

1
sudo apt download linux-image-5.8.0-43-generic

下载下来是一个deb文件,解压

1
2
3
4
5
6
7
8
9
10
$ dpkg -X ./linux-image-5.8.0-43-generic_5.8.0-43.49~20.04.1_amd64.deb extract
./
./boot/
./boot/vmlinuz-5.8.0-43-generic
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/linux-image-5.8.0-43-generic/
./usr/share/doc/linux-image-5.8.0-43-generic/changelog.Debian.gz
./usr/share/doc/linux-image-5.8.0-43-generic/copyright

遇到的问题

1.Linux内核编译错误

2.kernel无法开启,无效循环(我重新做了一次后发现问题消失了,目前不知道原因)