Linux内核漏洞利用(一)环境配置

我的实验环境是:

  • Ubuntu 12.04 x86
  • qemu
  • linux-2.6.32
  • busybox 1.19.4

安装qemu

1
$ sudo apt-get install qemu qemu-system

Linux内核编译

1
2
3
4
5
6
7
8
$ wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz
$ tar zxvf linux-2.6.32.tar.gz
$ cd linux-2.6.32/
$ sudo apt-get install libncurses5-dev
$ make menuconfig
$ make
$ make all
$ make modules

编译过程中可能出现一些问题,主要是因为gdb版本不同,建议先进行修改再进行编译,可以剩很多时间。 修改: 1.在内核目录arch/x86/vdso/Makefile中,大约在28,29行 找到 VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1   -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 把“-m elf_x86_64” 替换为 “-m64” 2.然后再继续找,大约在72行左右,找到VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1中的 “-m elf_i386” 替换为 “-m32” 3.打开文件drivers/net/igbvf/igbvf.h,看128行,代码为:struct page page;再往上看,第123行,也有struct page page;这行代码,这个结构定义在内部的一个结构体中。就是他的名字与128行的重复了,而4.6.3的编译器对不支持这种方式的定义,将128行的代码注释掉。

编译busybox

1
2
3
4
5
6
$ cd ..
$ wget https://busybox.net/downloads/busybox-1.19.4.tar.bz2
$ tar -jxvf busybox-1.19.4.tar.bz2
$ cd busybox-1.19.4
$ make menuconfig # Busybox Settings -> Build Options -> Build Busybox as a static binary
$ make install

编译出错

1
make: *** [busybox_unstripped] Error1

make menuconfig去掉如下选项
Linux System Utilities -> [] Support mounting NFS file system 网络文件系统
Networking Utilities -> [] inetd (Internet超级服务器)
编译成功后做如下配置:

1
2
3
4
5
6
7
8
9
10
11
$ cd _install
$ mkdir proc sys dev etc etc/init.d
$ vim etc/init.d/rcS
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
$ chmod +x etc/init.d/rcS
$ find . | cpio -o --format=newc > ../rootfs.img
$ cd ../../linux-2.6.32
$ qemu-system-i386 -kernel arch/i386/boot/bzImage -initrd ../busybox-1.19.4/rootfs.img -append "root=/dev/ram rdinit=/sbin/init"

8.18补充
最近又发现了一些qemu的使用姿势:

1
2
#!/bin/sh
qemu-system-i386 -m 128M -kernel linux-2.6.32/arch/i386/boot/bzImage -initrd busybox-1.19.4/rootfs.img -append "console=ttyS0 root=/dev/ram rdinit=/sbin/init" --nographic -s

将上述内容保存到boot.sh文件,添加可执行权限,./boot.sh即可启动内核。其中-m是指定RAM大小(默认384);--nographicconsole=ttyS0一起使用,启动的界面就变成当前终端;-s相当于-gdb tcp::1234的简写,可以直接通过主机的gdb远程连接。
reference
http://bobao.360.cn/learning/detail/3700.html
https://github.com/surajx/qemu-arm-linux/wiki/Compile-Linux,-BusyBox-for-ARM-and-load-it-using-QEMU
http://8happyer.blog.163.com/blog/static/96453662012263536678/