最初の一歩


昨日書いたように RAMDisk Image を作って mkimage すれば PC-P1LAN の initrd をいじくれそうなので、 試してみる。

initrd の取り出し

ファーム 1.11 の initrd.boot から initrd を取り出す
root@gawa root]# cd /usr/local/BootServer/tftpboot/firm/
[root@gawa firm]# ls
initrd.boot*  uImage*
[root@gawa firm]# dd if=initrd.boot of=initrd.gz bs=64 skip=1
読み込んだブロック数は 113253+1
書き込んだブロック数は 113253+1
[root@gawa firm]# mkdir /mnt/pc-p1lan
[root@gawa firm]# mv initrd.gz /mnt/pc-p1lan
[root@gawa firm]# cd /mnt/pc-p1lan/
[root@gawa pc-p1lan]# gunzip initrd.gz
[root@gawa pc-p1lan]# mv initrd initrd.orig
[root@gawa pc-p1lan]# cp initrd.orig initrd

initrd のマウント

initrd をマウントする
[root@gawa pc-p1lan]# mkdir /tmp/root
[root@gawa pc-p1lan]# mount -o loop initrd /tmp/root
[root@gawa pc-p1lan]# df
ファイルシステム    1k-ブロック   使用中      空き 使用% マウント場所
/dev/hda1              2071384   1040032    926128  53% /
none                     63756         0     63756   0% /dev/shm
/dev/hda3            285857724  39215052 232121924  15% /mnt
/mnt/pc-p1lan/initrd     15863     13320      2543  84% /tmp/root
[root@gawa pc-p1lan]#

はじめの一歩は?

さて、どこをいじくったらファームが書き換えられた事を 確認できるのだろう???

以前 P1LAN では、inetd が起動していて、telnet すると、

[root@giga root]# telnet p1lan
Trying 192.168.1.51...
Connected to p1lan.
Escape character is '^]'.
telnetd: bind: Address already in use
Connection closed by foreign host.
[root@giga root]#
となることを見つけた。

inetd から telnet を起動しないようにすれば
telnetd: bind: Address already in use
から
Connection refused
になって、書き換えられた事がわかるのではないか。

inetd.conf の修正

早速、inetd.conf から telnetd を消してみる。
[root@gawa pc-p1lan]# pushd /tmp/root/etc
/tmp/root/etc /mnt/pc-p1lan
[root@gawa etc]# cat inetd.conf
#telnet stream  tcp     nowait  root    /sbin/telnetd   /sbin/telnetd
telnet  stream  tcp     nowait  root    /sbin/telnetd   telnetd -l /bin/login
#sshd support added below
#sshd support added below
#ssh    stream  tcp     nowait  root    /usr/sbin/sshd sshd -i -q -f /etc/ssh/sshd_config
[root@gawa etc]# vi inetd.conf
	:
	:
[root@gawa etc]# cat inetd.conf
#telnet stream  tcp     nowait  root    /sbin/telnetd   /sbin/telnetd
#telnet stream  tcp     nowait  root    /sbin/telnetd   telnetd -l /bin/login
#sshd support added below
#sshd support added below
#ssh    stream  tcp     nowait  root    /usr/sbin/sshd sshd -i -q -f /etc/ssh/sshd_config
[root@gawa etc]# popd
/mnt/pc-p1lan
[root@gawa pc-p1lan]# umount /tmp/root

initrd.boot の作成スクリプト

これから何度も mkimage を使ってinitrd.boot を作るであろう。
いちいちコマンドラインを思い出して入力するのは非現実なので、 スクリプトにする
[root@gawa pc-p1lan]# cat mkinitrd.boot.sh
#        tools/mkimage -A arch -O os -T type -C comp -a addr -e ep \
#                      -n name -d data_file image
#          -A ==> set architecture to 'arch'
#          -O ==> set operating system to 'os'
#          -T ==> set image type to 'type'
#          -C ==> set compression type 'comp'
#          -a ==> set load address to 'addr' (hex)
#          -e ==> set entry point to 'ep' (hex)
#          -n ==> set image name to 'name'
#          -d ==> use image data from 'datafile'
#
#[root@gawa u-boot-1.1.4]# ./tools/mkimage -l /tmp/p1lan/initrd.boot
#Image Name:   RAM Disk
#Created:      Sat Dec 17 16:43:56 2005
#Image Type:   ARM Linux RAMDisk Image (gzip compressed)
#Data Size:    7248200 Bytes = 7078.32 kB = 6.91 MB
#Load Address: 0x00000000
#Entry Point:  0x00000000
#
#
u-boot-1.1.4/tools/mkimage \
        -A "ARM" \
        -O "Linux" \
        -T "ramdisk" \
        -C "gzip" \
        -a "0x00000000" \
        -e "0x00000000" \
        -n "RAM Disk" \
        -d "initrd" \
        /usr/local/BootServer/tftpboot/firm/initrd.boot

ls -l /usr/local/BootServer/tftpboot/firm/
[root@gawa pc-p1lan]#

標準ファームの待避

/usr/local/BootServer/tftpboot/firm/initrd.boot はいつでも戻せるよう 待避しておく
[root@gawa pc-p1lan]# pushd /usr/local/BootServer
/usr/local/BootServer /mnt/pc-p1lan
[root@gawa BootServer]# ls
fwupdated*  rarpcfgd*  rarpd*  tftpboot/  tftpboot_1.00/  tftpd*
[root@gawa BootServer]# mv tftpboot tftpboot_1.11
[root@gawa BootServer]# mkdir tftpboot
[root@gawa BootServer]# (cd tftpboot_1.11; tar cf - .)|(cd tftpboot; tar xvf -)
./
./files
./version
./firm/
./firm/initrd.boot
./firm/uImage
[root@gawa BootServer]# popd
/mnt/pc-p1lan
[root@gawa pc-p1lan]#

initrd.boot の作成

mkinitrd.boot.sh を実行する
[root@gawa pc-p1lan]# sh mkinitrd.boot.sh
Image Name:   RAM Disk
Created:      Wed Feb 4 21:27:49 2006
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    16777216 Bytes = 16384.00 kB = 16.00 MB
Load Address: 0x00000000
Entry Point:  0x00000000
合計 17292
-rwxr--r--    1 yasunari yamasita 16777280 Feb  4 21:27 initrd.boot
-rwxr--r--    1 yasunari yamasita   898316 Sep 24 18:41 uImage
[root@gawa pc-p1lan]#

PC-P1LAN の起動

新しい initrd.boot ができたので、PC-P1LAN のコンセントを抜き、 再度刺して電源を入れる。これで initrd.boot を再度ダウンロードする。

telnet してみる。
Connection refused になれば大正解

[root@gawa pc-p1lan]# telnet p1lan
Trying 192.168.1.51...
Connected to p1lan.
Escape character is '^]'.
telnetd: bind: Address already in use
Connection closed by foreign host.
[root@gawa pc-p1lan]#
がー。大失敗。Address already in use のまま。

キャッシュ?

そんなわけない。手順は正しいはず。
可能性があるなら、tftpd がキャッシュしていて initrd.boot のファイルを書き換えても P1LAN にダウンロードされるのは 古い initrd.boot だったりするのでは?

起動サーバを再起動する

[root@gawa pc-p1lan]# /etc/rc.d/init.d/ltbootd stop
Stop services: rarpd/sbin/start-stop-daemon: warning: failed to kill 15262: No such process
/sbin/start-stop-daemon: warning: failed to kill 15252: No such process
/sbin/start-stop-daemon: warning: failed to kill 15250: No such process
 tftpd rarpcfgd/sbin/start-stop-daemon: warning: failed to kill 15264: No such process
/sbin/start-stop-daemon: warning: failed to kill 15257: No such process
 fwupdated.
[root@gawa pc-p1lan]# !:s/op/art/
/etc/rc.d/init.d/ltbootd start
Starting services: rarpd tftpd rarpcfgd fwupdated.
[root@gawa pc-p1lan]#
注:「!:s/op/art/」って何してるか理解してから真似してくださいね。

PC-P1LAN の再起動

もう一回 PC-P1LAN のコンセントを抜き電源を入れる。
起動したところで再度 telnet してみる
[root@gawa pc-p1lan]# !telnet
telnet p1lan
Trying 192.168.1.51...
telnet: connect to address 192.168.1.51: Connection refused
[root@gawa pc-p1lan]#
Good Job!


U-Boot
ハックの記録
PC-P1LAN をハックしよう

PC-P1LAN に telnet

Copyright (C) 2006 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp 山下康成@京都府向日市