Linux内核漏洞利用-环境配置(转)
实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu
0x00 安装qemu
sudo apt-get install qemu qemu-system
0x01 Linux内核编译
$ 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
编译时遇到的问题:
错误1:
/usr/src/linux-2.6.32/arch/x86/include/asm/ptrace.h:146:13: note: previous declaration of 'syscall_trace_leave' was here make[2]: *** [arch/x86/kernel/ptrace.o] Error 1 make[1]: *** [arch/x86/kernel] Error 2 make: *** [arch/x86] Error 2
解决方法:
patch
--- linux-2.6.32.59/arch/x86/include/asm/ptrace.h
+++ fix_ptrace.o_compile_error/arch/x86/include/asm/ptrace.h
@@ -130,6 +130,7 @@
#ifdef __KERNEL__
#include <linux/init.h>
+#include <linux/linkage.h>
struct cpuinfo_x86;
struct task_struct;
@@ -142,8 +143,8 @@
int error_code, int si_code);
void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
-extern long syscall_trace_enter(struct pt_regs *);
-extern void syscall_trace_leave(struct pt_regs *);
+extern asmregparm long syscall_trace_enter(struct pt_regs *);
+extern asmregparm void syscall_trace_leave(struct pt_regs *);
static inline unsigned long regs_return_value(struct pt_regs *regs)
{
错误2:
gcc: error: elf_i386: No such file or directory OBJCOPY arch/x86/vdso/vdso32-int80.so objcopy: 'arch/x86/vdso/vdso32-int80.so.dbg': No such file make[2]: *** [arch/x86/vdso/vdso32-int80.so] Error 1 make[1]: *** [arch/x86/vdso] Error 2 make: *** [arch/x86] Error 2
解决方法:
原因是 gcc 4.6 不再支持 linker-style 架构。讲 arch/x86/vdso/Makefile 中, 将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。 将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。
错误3:
drivers/net/igbvf/igbvf.h:128:15: 错误: 重复的成员‘page’ make[4]: *** [drivers/net/igbvf/ethtool.o] 错误 1 make[3]: *** [drivers/net/igbvf] 错误 2 make[2]: *** [drivers/net] 错误 2 make[1]: *** [drivers] 错误 2
解决方法:
1. 根据linux社区的建议,此错误是由于gcc版本与内核版本的冲突导致的。他们的建议是更换新版本的内核,但是某些特殊条件下,我们不能更换内核版本,于是我们修改内核代码适应当前的编译器。 2. 按照错误的指示,错误的代码是在drivers/net/igbvf/igbvf.h文件的第128行。 3. 打开文件,看128行,代码为:struct page *page;再往上看,第123行,也有struct page *page这行代码,这个结构定义在内部的一个结构体中。就是他的名字与128行的重复了, 而4.6.3的编译器对不支持这种方式的定义,我们修改128行的代码为struct page *pagep;保存退出;
0x02 编译busybox
$ wget https://busybox.net/downloads/busybox-1.27.2.tar.bz2 $ tar -jxvf busybox-1.27.2.tar.bz2 $ cd busybox-1.27.2 $ make menuconfig # Busybox Settings -> Build Options -> Build Busybox as a static binary $ make install
0x03 全部编译成功后做如下配置
#进入busybox的_install目录 $ 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 #进入linux内核目录 $ 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"
0x04 成功
。
Always believe that good things will come.