Hack BBS

[全部のスレッド一覧][新規投稿][記事の削除・変更] [Home Page]

返信投稿はタイトルのリンクをクリックして下さい
スレッド【No.280】の中の記事をすべて表示しています

【No.280】のスレッド
04/04/16(金) 02:49:21 投稿者[たつや] <http://linkstation.yi.org/> [No.280]のスレッド内
【No.280】 タイトル[ブートローダの隠しコマンド発見か?でもうまくいかず] この記事がスレッドの最初です
ブートローダ (/dev/fl2) の内容を逆アセンブルしたものとソース CD
のブートローダのソースを比較して、ローダのコマンドモードの処理へ
の入り口を見つけました。しかし、(どう見ても)バグのため、このコマ
ンドモードを呼び出すことができません。

ブートローダの逆アセンブルリストとソース CD のソースを比較してい
て、変なことに気がつきました。ソースの arch/ppc/boot/common/
misc-simple.c の decompress_kernel に以下のような部分があります。

puts("\n>>");
cp = cmd_line;
*cp = 0;
memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));
while ( *cp ) putc(*cp++);
timer = 0;
while (timer++ < 1*1000) {
if (tstc()) {
cp = input_cmd(cp,256);
break;
}
udelay(10000);
}
*cp = 0;
puts("\n");

#ifdef FLASH_BOOT_IMAGE
i=0;while(i<5 && cmd_line[i] == "debug"[i]) ++i;
#endif

cmd_preset には、デフォルトのカーネルパラメータ "root=/dev/hda1"
が入っています。
tstc() はシリアルコンソールからのキー入力の有無を返し、input_cmd()
は、1行入力です。
おそらくやりたいことは、デフォルトのカーネルパラメータを表示し、
タイムアウト時間内にキー入力を行えばカーネルパラメータを編集する
ことができるようにしたかったのだと思うのですが、このコードではパ
ラメータの追加はできますがデフォルトのカーネルパラメータを変更す
ることはできません。

また、最後のループでは入力した文字列と debug を比較しています。
しかし、この後変数 i はこの関数内では使用されていません。比較を
行った後、その結果を評価しないというのはおかしいですね。
/dev/fl2 のブートローダの逆アセンブルリストから該当部分のソースを
類推すると、

i=0;while(i<5 && cmd_line[i] == "debug"[i]) ++i;
if (i > 4) {
unknown_func();
}

のような処理が存在しています。unknown_func() はソースファイルに
は存在しない関数ですので適当な名前をつけていますが、この関数はコ
マンド入力を受けて対応する処理関数を呼び出す処理をしているようで
す。つまり、これがほしかったコマンド入力部分だと思われますが、
ソースではこの部分が削除されてしまっています。

(ちなみに、関数単位に /dev/fl2 のローダとソースの中身を比べた結
果、ソースが見つからない関数がこのほかにも 20数個あることがわか
りました。先ほどの unknown_func() から呼び出される各コマンドの
処理関数も、ソースには存在しません。両者に共通の関数については
中身がほとんど同じ(それこそ命令の順序、レジスタへの割り当てと
いった、最適化レベルでの差しかない)ですので、単純に機能を削ら
れたと考えられます。)

したがって、ソースからコンパイルしたブートローダを LinkStation
に書き込んだ場合、コマンドモードの機能はまったく存在しないことに
なります。

また、ソースからのコンパイルはあきらめて、現在使用しているブート
ローダでコマンドモードに移行する方法を探したのですが、先ほど書い
たようにカーネルパラメータの変更は出来ないので、cmd_line の先頭
を "debug" に書き換える方法がありません。これはバグとしか思えな
いのですが、結果としてコマンドモードを呼び出す方法がないように思
えます。

しかし、提供されたソースでは何で機能が削られたんでしょうね。
「完全な」ソースを要求してから約1ヶ月待たされたことと、その間に
1.40 がリリースされたことの間に何の関係もないのであればいいのです
が、このような違いを見つけてしまうと疑わざるを得ません。

04/04/17(土) 14:46:37 投稿者[ゲン] <http://www.type-g.com> [No.280]のスレッド内
【No.298】 タイトル[Re: ブートローダAlart mode突入しました] 【No.280】に対する返信
たつやさんの情報を元に危ない橋を渡ってみました。
吸い出した/dev/fl2の9000h〜、「root=/dev/hda1」の部分を
ゼロfillして、/dev/fl2に書き戻してみました。

で、

******* Product Information *******
----------------------------------
Product Name: HD-HLAN(HIDETADA)
VER: 1.03
Date: 2004/3/5 14:37:34
----------------------------------
Firmware check:done.

>>debug
[Alart mode]
#help
commands:
ledstop flash erasek writeb
writef mmb md help
quit
>RET:0

こんなんでました笑

quitすればちゃんと/dev/hda1から起動してくれます。
ここ2週間ほどブートのモニタープログラムを探していたモノで、
ソースを解析しなくとも「debug」という単語がキーであると
思っていました。たつやさんの解析で、確信できました。

一度で成功したわけではなく、、、一台玄箱を再起不能に
してしまいましたが。。。

詳しくはtype-g.comを更新します。。

04/04/17(土) 18:27:10 投稿者[ゲン] <http://www.type-g.com> [No.280]のスレッド内
【No.299】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.298】に対する返信
AlertModeのerasekコマンドは危険です!!
コマンド一発で、ファームの一部が消えてしまいました。

#erasek

******* Product Information *******
----------------------------------
Product Name:
VER: 65535.65535
Date: 1899/-1/-1 -1:-1:-1
----------------------------------
Firmware check:Fail!:invalid Firmware size

玄箱に続き、LinkStationも再起不能にしてしまいました・・・あーあ・・
Are you sure?ぐらい聞いてくれればいいのに・・・

04/04/18(日) 23:19:22 投稿者[NAME] [No.280]のスレッド内
【No.312】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.299】に対する返信
>----------------------------------
>Firmware check:Fail!:invalid Firmware size
>
>玄箱に続き、LinkStationも再起不能にしてしまいました・・・あーあ・・
>Are you sure?ぐらい聞いてくれればいいのに・・・

ご愁傷様です。HPも拝見させていただきました。
フラッシュROMのデータシートが見つからないとのことでしたが、
「槻ノ木隆のPC実験室」からたどれるものがありました。
ttp://pc.watch.impress.co.jp/docs/2004/0317/pclabo23.htm
ttp://www.fme.fujitsu.com/products/mirrorflash/pdf/29pl32tm_bm_ae0.3e.pdf
フラッシュROMをはんだを使って剥がしてから、ライタでデータを書き込んでやれば
復旧できるかも・・・。

04/04/19(月) 11:22:26 投稿者[ゲン] <http://www.type-g.com> [No.280]のスレッド内
【No.320】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.312】に対する返信
>ご愁傷様です。HPも拝見させていただきました。
>フラッシュROMのデータシートが見つからないとのことでしたが、
>「槻ノ木隆のPC実験室」からたどれるものがありました。

非常にありがたい情報です。ありがとうございます!!

>フラッシュROMをはんだを使って剥がしてから、ライタでデータを書き込んでやれば
>復旧できるかも・・・。

2台再起不能になっているので、一台は手っ取り早くご提案の方法で
ROMをはがして、DIP変換して差し替え可能にしようと考えています。
ライターは無いので、自作の予定です。
ただ、あのピン間ピッチのICをハンダこてではがすのは、相当つらいんですよね。。

04/04/18(日) 03:13:53 投稿者[山下康成] <http://www.yamasita.jp/> [No.280]のスレッド内
【No.308】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.299】に対する返信
>AlertModeのerasekコマンドは危険です!!
>コマンド一発で、ファームの一部が消えてしまいました。
>
>#erasek

erase kernel の略でしょうかね?

>玄箱に続き、LinkStationも再起不能にしてしまいました・・・あーあ・・

ご愁傷様です。
シリアルコンソール付けた痕跡があったりすると、
無償修理も無理でしょうね。(開封時点でアウトですが)

#私にはフラッシュを書き換える勇気がありません^_^;

04/04/19(月) 11:16:37 投稿者[ゲン] <http://www.type-g.com> [No.280]のスレッド内
【No.319】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.308】に対する返信
>erase kernel の略でしょうかね?

のようです。

>ご愁傷様です。
>シリアルコンソール付けた痕跡があったりすると、
>無償修理も無理でしょうね。(開封時点でアウトですが)

コンソール改造着手の時点でハラをくくってますから、ここまで来て
修理依頼なんて言う恥ずかしい真似はしません(半ば強がりですが)

>#私にはフラッシュを書き換える勇気がありません^_^;

これを気に、一時中断していたフラッシュ書き換え案検討を再開しました。

04/04/18(日) 02:15:19 投稿者[たつや] <http://linkstation.yi.org/> [No.280]のスレッド内
【No.303】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.299】に対する返信
>******* Product Information *******
>----------------------------------
>Product Name: HD-HLAN(HIDETADA)
> VER: 1.03
> Date: 2004/3/5 14:37:34
>----------------------------------

おぉ!!出ましたか!

>玄箱に続き、LinkStationも再起不能にしてしまいました・・・あーあ・・

なんと。

>Are you sure?ぐらい聞いてくれればいいのに・・・

そうなんですよね。私も不思議に思っていたのですが、コマンドに
パラメータがある風でもないし、コマンドで呼び出される関数内で
文字入力を行う関数を呼び出しているわけでもなさそうなので、コ
マンドの動作がわからないと怖くてためしにたたいて見ることも出
来ないと思っていたのですが、、、、やっちゃいましたか :-)

writef, writeb が書き込み関係らしいコマンドだと思っていますが、
書き込むデータはどのような形式で送ったらいいのか、など、まだ
まだ謎です。

04/04/19(月) 11:10:14 投稿者[ゲン] <http://www.type-g.com> [No.280]のスレッド内
【No.318】 タイトル[Re: ブートローダAlart mode突入しました→危険!] 【No.303】に対する返信
>writef, writeb が書き込み関係らしいコマンドだと思っていますが、
>書き込むデータはどのような形式で送ったらいいのか、など、まだ
>まだ謎です。

確かにそうなんです。昔、さわったことのあるLinux組み込みボードでは、
Teratermから、sendfileした覚えはありますが。。

ホームページにも書きましたが、erasekでカーネルが消えちゃうのは
わかるのですが、その後、手も足も出なくなるモニタープログラムって
何の意味も無いんですよねぇ。

これを気に、本格的にFlash書き込み手段について模索してみようと
思います。

04/04/16(金) 06:38:21 投稿者[ぴろーね] [No.280]のスレッド内
【No.282】 タイトル[Re: ブートローダの隠しコマンド発見か?でもうまくいかず] 【No.280】に対する返信
>ブートローダ (/dev/fl2) の内容を逆アセンブルしたものとソース CD
>のブートローダのソースを比較して、ローダのコマンドモードの処理へ
>の入り口を見つけました。しかし、(どう見ても)バグのため、このコマ
>ンドモードを呼び出すことができません。
>
>ブートローダの逆アセンブルリストとソース CD のソースを比較してい
>て、変なことに気がつきました。ソースの arch/ppc/boot/common/
>misc-simple.c の decompress_kernel に以下のような部分があります。
>
> puts("\n>>");
> cp = cmd_line;
> *cp = 0;
> memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));
> while ( *cp ) putc(*cp++);
> timer = 0;
> while (timer++ < 1*1000) {
> if (tstc()) {
> cp = input_cmd(cp,256);
> break;
> }
> udelay(10000);
> }
> *cp = 0;
> puts("\n");
>
>#ifdef FLASH_BOOT_IMAGE
> i=0;while(i<5 && cmd_line[i] == "debug"[i]) ++i;
>#endif
>
>cmd_preset には、デフォルトのカーネルパラメータ "root=/dev/hda1"
>が入っています。
>tstc() はシリアルコンソールからのキー入力の有無を返し、input_cmd()
>は、1行入力です。
>おそらくやりたいことは、デフォルトのカーネルパラメータを表示し、
>タイムアウト時間内にキー入力を行えばカーネルパラメータを編集する
>ことができるようにしたかったのだと思うのですが、このコードではパ
>ラメータの追加はできますがデフォルトのカーネルパラメータを変更す
>ることはできません。
>
>また、最後のループでは入力した文字列と debug を比較しています。
>しかし、この後変数 i はこの関数内では使用されていません。比較を
>行った後、その結果を評価しないというのはおかしいですね。
>/dev/fl2 のブートローダの逆アセンブルリストから該当部分のソースを
>類推すると、
>
> i=0;while(i<5 && cmd_line[i] == "debug"[i]) ++i;
> if (i > 4) {
> unknown_func();
> }
>
>のような処理が存在しています。unknown_func() はソースファイルに
>は存在しない関数ですので適当な名前をつけていますが、この関数はコ
>マンド入力を受けて対応する処理関数を呼び出す処理をしているようで
>す。つまり、これがほしかったコマンド入力部分だと思われますが、
>ソースではこの部分が削除されてしまっています。
>
>(ちなみに、関数単位に /dev/fl2 のローダとソースの中身を比べた結
>果、ソースが見つからない関数がこのほかにも 20数個あることがわか
>りました。先ほどの unknown_func() から呼び出される各コマンドの
>処理関数も、ソースには存在しません。両者に共通の関数については
>中身がほとんど同じ(それこそ命令の順序、レジスタへの割り当てと
>いった、最適化レベルでの差しかない)ですので、単純に機能を削ら
>れたと考えられます。)
>
>したがって、ソースからコンパイルしたブートローダを LinkStation
>に書き込んだ場合、コマンドモードの機能はまったく存在しないことに
>なります。
>
>また、ソースからのコンパイルはあきらめて、現在使用しているブート
>ローダでコマンドモードに移行する方法を探したのですが、先ほど書い
>たようにカーネルパラメータの変更は出来ないので、cmd_line の先頭
>を "debug" に書き換える方法がありません。これはバグとしか思えな
>いのですが、結果としてコマンドモードを呼び出す方法がないように思
>えます。
>
>しかし、提供されたソースでは何で機能が削られたんでしょうね。
>「完全な」ソースを要求してから約1ヶ月待たされたことと、その間に
>1.40 がリリースされたことの間に何の関係もないのであればいいのです
>が、このような違いを見つけてしまうと疑わざるを得ません。

ときに、ブートローダのライセンスはどうなっているのですか?

04/04/16(金) 07:48:11 投稿者[たつや] <http://linkstation.yi.org/> [No.280]のスレッド内
【No.283】 タイトル[Re: ブートローダの隠しコマンド発見か?でもうまくいかず] 【No.282】に対する返信
な、なぜ全文引用??

>ときに、ブートローダのライセンスはどうなっているのですか?

GPL です。