DHCPおよびSSHの名前でのuboot-elfの手動編集

ハードウェアAEWIN SCB-3240に出会ったとき、それは二度と触れないという目標を持って、サーバーラックに永遠に収まるはずでした。 これは、本来の目的ではなく、製品のテストを目的として使用される予定でした。 Kaspersky Labには伝統があります-Cでコードをコンパイルできるものがあれば、考えられるすべてのプラットフォーム用のウイルス対策SDKをリリースします。したがって、SDKにはウイルス対策データベースが必要です。テストする必要があります-SDK自体、データベースローダー、または一部のプラットフォーム機能にエラーがある場合、または...一般に、100万の理由。 そして、新しいサポートケースよりも少し前に問題について学ぶために、最後の防衛線は、パフォーマンスのためにアンチウイルスデータベースの各セットをチェックする数十個の鉄片です。



つまり、関心があったのはAEWINがネットワークを操作する能力ではなく、MIPS / Linuxの形での本質だけでした。 問題は、鉄片が適切な接続を提供しなかったことです。 私に提供されたのは、コンソールポート、telnet、およびdhcpだけでした。



残念ながら、最悪の恐怖は無駄ではありませんでした。 デバイスには永続的なストレージがなく、参照イメージを展開するたびに、電源を入れてから再起動するまでしか動作しませんでした。



必要な合計。 DHCP経由でアドレスを取得する方法を教え、SSH接続を受け入れる方法を彼女に教え、途中で中断しないようにしてください。



パート1 Ssh。

SSHサーバーとして、dropbearを使用することが決定されました。 実際、機能の比較テストと分析は行われませんでした。すでに使用したものを選択しました。 最初のステップでは、Dropbearのソースコード( https://matt.ucc.asn.au/dropbear/およびOcteonSDK)が必要になります。後者はパートナーのみが利用できるため、既に持っていると想定しています。

プロセス自体は簡単です。 SDKからツールチェーンを展開し、dropbearソースを展開します。



export CC=/home/pony/octeon_sdk/tools-gcc-4.1/bin/mips64-octeon-linux-gnu-gcc ./configure --host=mips64-octeon-linux-gnu --prefix=/home/pony/dropbear --exec-prefix=/home/pony/dropbear/bin --disable-zlib make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" make install
      
      





/ホーム/ポニー/ドロップベア/ビンからバイナリをピックアップします



パート2 ファームウェア。

ここでは、TFTPサーバーと、過労を容易にするためにOpenDHCPサーバーが必要です。



鉄片を最初のネットワークポートに接続し(IPを高速化)作業中のマシンに接続し、TFTP + OpenDHCPを実行します



コンソールポートに接続しました。私の場合は、 CiscoConsoleとTrendNet COM2USBのペアで、 鉄片をオンにします。 最初の「キーを押して自動ブートを停止する」をスキップし、2番目のキーを待ちます-

インターフェース3には4つのポートがあります(LOOP)

インターフェース4には1つのポート(AGL)があります

キーを押して自動ブートを停止します:0



DHCP経由でアドレスを取得します

Octeon aewin3240(RAM)#dhcp



ロード方法を確認します。

Octeon aewin3240(RAM)#grepenvブート

bootcmd = fatload mmc 1:2 0x100000 vmlinux.64; bootoctlinux 0x100000 coremask = 0xf mem = 0



つまり、システムイメージは内部MMCカードに保存されます。 このイメージを自分で取る必要があります。



ハードウェアからイメージをメモリに読み込みます-ファイルからの名前とパス(mmc 1:2 vmlinux.64)があり、bootコマンドで判断すると、アドレス0x100000は空いていることが予想されます。

Octeon aewin3240(ram)#fatload mmc 1:2 0x100000 vmlinux.64



TFTPを入力します(前のステップでコンソールに結果としてサイズを取得します。16進数に変換するだけです)。

Octeon aewin3240(ram)#tftpput 0x100000 0x332C650 192.168.0.1:vmlinux.64



パート3。 生体解剖。



結果のファイルは自己解凍型のELFであり、キットにinitramfsイメージが含まれています。これはブート段階でカーネルとともに解凍されます。 したがって、このイメージを取得し、必要な変更を加えてから組み立て直す必要があります。 残念ながら、私はオリジナルを持っていません-カーネルとELFが構築された他のファイルで。 したがって、のこぎりと外科用接着剤を明らかにする必要があります。 ファイルにあるものを見てみましょう-



root @ ponybuntu:/ home / root / uboot#objdump -h vmlinux.64

セクション:

Idx名前サイズVMA LMAファイルオフAlgn

...

11 .init.text 0002a534 ffffffff8090e000 ffffffff8090e000 0080f000 2 ** 5

コンテンツ、ALLOC、LOAD、READONLY、CODE

12 .init.data 02aee0d0 ffffffff80938540 ffffffff80938540 00839540 2 ** 5

コンテンツ、ALLOC、ロード、データ

13 .exit.text 00001920 ffffffff83426610 ffffffff83426610 03327610 2 ** 2

コンテンツ、ALLOC、LOAD、READONLY、CODE

...

initramfsの唯一の候補は、サイズが0x02aee0d0 = 45015248バイトの.init.dataセクションです

まず、 Gentushniksに頭を下げて、initramfsイメージがgzipに保存されていることを確認ましょう 。 画像内のGZIP形式のヘッダーを探しています:

root @ ponybuntu:/ home / root / uboot#binwalk vmlinux.64 | grep gzip

5962904 0x5AFC98 gzip圧縮データ、Unixから、NULL日付:木1月1日03:00:00 1970、最大圧縮

8705696 0x84D6A0 gzip圧縮データ、Unixから、最終変更日:2015年2月2日19:15:12、最大圧縮



.init.dataの下でのオフセットに適しているのは0x84D6A0だけです。引き出してみてください。 アーカイブは明らかにセクションの制限を超えないため、サイズは次のセクションの先頭のアドレスからgzipの先頭のアドレスを引いたものになります。

0x03327610-0x0084D6A0 = 0x02AD9F70 = 44932976バイト。 切り取る:

root @ ponybuntu:/ home / root / uboot#dd if = vmlinux.64 bs = 1 oflag = seek_bytes skip = 8705696 count = 44932976> ramfs.gz.orig



開梱:

root @ ponybuntu:/ home / root / uboot#gunzip <ramfs.gz.orig> initramfs.cpio

gzip:stdin:解凍OK、後続のゴミは無視されます



そして、ここで私たちは罪を待っています。 「無視されたゴミを捨てる」ことから判断すると、カットされたピースのすべてがアーカイブであるとは限りませんでした。 これはまだ私たちに戻ってきますが、今のところ、すべてが正常であると仮定します。



initramfs.cpio = 143785984のサイズを覚えておいてください



パート4 画像を準備しています。

initramfsを一時フォルダーにマウントします。

root @ ponybuntu:/ tmp / ramfs#cpio -i -d -H newc --no-absolute-filenames <initramfs.cpio

ルート@ ponybuntu:/ tmp / ramfs#ls

bin devなどの例home init lib lib32 lib32-fp lib64 lib64-fp linuxrc mnt mnth proc root sbin share sys tmp usr var



Dropbearバイナリを/ binおよび/ sbinに追加し、自動起動+ eth0を上げる+ / sbin / rcでIPを取得するように設定-追加

 echo Setting up network ifconfig eth0 up udhcpc -i eth0 #Start sshd if it exists if [ -e /sbin/dropbear ]; then echo Generating Drpbear keys if [ ! -e /etc/ssh_host_rsa_key ]; then /bin/dropbearkey -t rsa -f /etc/ssh_host_rsa_key fi if [ ! -e /etc/ssh_host_dsa_key ]; then /bin/dropbearkey -t dss -f /etc/ssh_host_dsa_key fi echo Starting Dropbear /sbin/dropbear -d /etc/ssh_host_dsa_key -r /etc/ssh_host_rsa_key fi
      
      





クリーン/サンプル-勤勉な中国人はこれを行うのを忘れていました。これにより、ファイルに使用できるスペースが増え、最終的なアーカイブが元のELFを超えてクロールされなくなります



これをinitramfsイメージに戻します。

root @ ponybuntu:/ tmp / ramfs#検索。 | cpio -H newc -o> /home/root/uboot/initramfs.cpio



画像をgzipにパックします。

root @ ponybuntu:/ home / root / uboot#gzip --best <initramfs.cpio> ramfs



結果のgzipを古いものに貼り付けます。

root @ ponybuntu:/ home / root / uboot#dd conv = notrunc if = ramfs of = vmlinux.64 oflag = seek_bytes seek = 8705696

87758 + 1レコード

87758 + 1レコード

44932351バイト(45 MB)コピー、0.130304秒、345 MB /秒



ここで私は自分より先に進みます。 鉄片を注いだ後のこのイメージは、開梱に関する苦情ですぐにカーネルパニックに陥ります。 そして間違いなく、ELFの「アンパッカー」は同僚のgzipほど明ではなく、アーカイブのサイズを完全に正確に知っていることを明確に期待しているということです。 私たちは、上記の「トレイリングガベージ」をすでに受け取っていたことを思い出します。これは、アーカイブとみなしたものがすべてではないことを微妙に示唆しています。 gzipの仕様によると、アーカイブの最後のレコードは、LittleEndianで展開されたデータのサイズです。 initramfs.cpio = 143785984 = 0x08920000のサイズを思い出してください。 アーカイブの最後にあるものを探しています:



root @ ponybuntu:/ home / root / uboot#tail -c 24 ramfs.gz.orig | hexdump -C

00000000 1f ff a9 e3 5f 8e 5b 98 18 00 00 92 08 00 00 00 | ...._。[......... |

00000010 00 00 00 00 00 02 ad 9f 65 | ....... e |



00 00 92 08-現在のファイルの終わりより11バイト早い。



したがって、実際のgzipサイズは、initramfs = 44932976-11 = 44932965 = 0x02AD9F65になります。 上を見て、最初に取り出したアーカイブの最後のバイトが正確に02と9f 65であることがわかります。つまり、「アーカイブの先頭から.init.dataセクションの終わりまで」アーカイブが配置されるだけでなく、少しのゼロとアーカイブのサイズも配置されます。 これは明らかに、ブート時にカーネルによって読み取られ、アンパックが試行されます。



上記のinitramfsで準備された「私たちの」アーカイブは、元のものよりわずかに小さいです。つまり、古いアーカイブの場所に貼り付けてから、セクションの最後でサイズを調整できます。



root @ ponybuntu:/ home / root / uboot#dd conv = notrunc if = ramfs of = vmlinux.64 oflag = seek_bytes seek = 8705696

87758 + 1レコード

87758 + 1レコード

44932351バイト(45 MB)コピー、0.130304秒、345 MB /秒



操作によりファイルが破損していないことを確認します。



root @ ponybuntu:/ home / root / uboot#readelf -h vmlinux.64

ELFヘッダー:

マジック:7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 00 00

クラス:ELF64

データ:2の補数、ビッグエンディアン

バージョン:1(現在)

OS / ABI:UNIX-システムV

ABIバージョン:0

タイプ:EXEC(実行可能ファイル)

マシン:MIPS R3000

バージョン:0x1

エントリポイントアドレス:0xffffffff8067f330

プログラム開始ヘッダー:64(ファイルへのバイト数)

セクションヘッダーの開始:53657872(ファイルへのバイト数)

フラグ:0x808b0001、noreorder、octeon、mips64r2

このヘッダーのサイズ:64(バイト)

プログラムヘッダーのサイズ:56(バイト)

プログラムヘッダーの数:2

セクションヘッダーのサイズ:64(バイト)

セクションヘッダーの数:21

セクションヘッダー文字列テーブルインデックス:20



苦情はありません。すべてが機能することを期待しましょう。 ここで、カーネルが予期するアーカイブサイズを修正する必要があります。 その後、偽物を取得し、マウスとGUIでWindows HexEditを使用しました-アドレス0x0332760Cに移動し、02 AD 9F 65を新しいアーカイブのサイズに変更します-44932351 = 02 AD 9C FF



保存し、tftpサーバーに置いて、鉄片をオンにします。もう一度2番目のキーを押して自動ブートを停止し、再びdhcpでアドレスを取得します。 tftpからメモリに新しいイメージをダウンロードします。



Octeon aewin3240(ram)#tftp 0x100000 192.168.0.1:vmlinux.64

octeth0デバイスの使用

サーバー192.168.0.1からのTFTP。 IPアドレスは192.168.0.2です

ファイル名「vmlinux.64」。

ロードアドレス:0x100000

読み込み中:##################################################### ##

10.4 MiB / s

やった

転送バイト= 53659216(332c650 hex)



ロードに使用した方法を思い出してください。

Octeon aewin3240(RAM)#grepenvブート

bootcmd = fatload mmc 1:2 0x100000 vmlinux.64; bootoctlinux 0x100000 coremask = 0xf mem = 0



フラッシュドライブから読み取る必要はありません。イメージはすでにパス0x100000に沿ってメモリ内にあるため、起動するだけです-bootoctlinux 0x100000 coremask = 0xf mem = 0 、次のように表示されます。

BusyBox v1.20.2(2015-02-02 22:37:53 CST)組み込みシェル(灰)

組み込みコマンドのリストを表示するには、「help」と入力します。

〜#



素晴らしい、それはロードします。 SSHは機能しています。 元の画像を当社の画像に置き換えることができます。

繰り返しますが、鉄片を「dhcp received」の段階にオーバーロードし、再び新しいイメージをダウンロードして、メモリから元のMMCに書き込みます。 念のため:



Octeon aewin3240(ram)#fatwrite mmc 1:2 0x100000 vmlinux.64.new 332c650

vmlinux.64.newの書き込み

53659216バイトが書き込まれました



コマンドを変更して、ハードウェアをロードします。

Octeon aewin3240(ram)#setenv bootcmd 'fatload mmc 1:2 0x100000 vmlinux.64.new; bootoctlinux 0x100000 coremask = 0xf mem = 0'

Octeon aewin3240(RAM)#saveenv



完了



このサクセスストーリーが将来誰にも役立つかどうかはわかりませんが、似たようなものに出会った場合、Googleで1〜2日費やすことができます。 ネットワーク上にあるマニュアルの大半は、元のファイル(カーネル、説明など)が存在するように設計されており、1つのコマンドでu-bootイメージを組み立てることができます。



All Articles