
ハードウェアハッキングチートシート
[[TOC]]
250-350 CGND、INまたはRX、OUTまたはTX、VCCを探す3/4ピンを探す
GNDへの参照を見つける
GNDVCCへの参照を見つける
VCCGNDに対する抵抗をテストする(マルチメータを抵抗測定に、通常200k)VCCに対する抵抗をテストする(マルチメータを抵抗測定に、通常)3.3Vまたは5V)を選択しないと、ボードまたはシリアルアダプタが損傷しますRXをアダプタTXに、ボードTXをアダプタRXに接続
VCCピンの接続は不要sudo lsusbでアダプタを特定ls -lart /devですべてのデバイスファイルを表示。アダプタは最後の方にあり、通常ttyUSB0dialoutグループのメンバーである必要がある(またはroot)。グループを確認するにはgroups $USER0または1に設定できるTCK、TDI、TDO、TMS、TRST(オプション)を探す
TCK (テストクロック): コントローラの速度を決めるドラマーまたはメトロノーム。このピンの電圧はリズミカルで安定したビートで上下にパルスします。クロックの各「ビート」ごとに、コントローラは1つのアクションを実行します。TMS (テストモード選択): モード選択ピンの電圧がJTAGの動作を制御します。このピンの電圧を操作することで、JTAGに何をしてほしいかを指示します。TDI (テストデータ入力): チップにデータを供給するピン。JTAG標準ではこのピンを介した通信プロトコルは定義されていません。それはメーカーに委ねられています。JTAGにとって、このピンは1と0がチップに入るための単なる入口です。チップがそれらをどう処理するかはJTAGには関係ありません。3.3V または 5V)を選択します。そうしないと、ボードまたはシリアルアダプタが損傷します。openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE:Focaccia board reference$BOARDCONFIGFILE:ハッキング対象ボードの設定ファイル(便利ですが、持っていない可能性もあります。オプションです)。
/usr/local 内にあります。ここに役立つ $BOARDCONFIGFILE が見つかるかもしれません。telnet localhost 4444
halt:CPUを停止(一時停止のようなもの)
U-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048:ページサイズ(バイト)mtd->oobsize=64:誤り訂正に使用されるデータ(バイト)devinfo.iowidth=8:1回の操作で書き込まれる/読み取られるデータ(バイト)mtd->erasesize=131072:EEPROMの残り書き込み回数?(多かれ少なかれ)init started またはそれに類する文字列を検索します。これはおそらく 文字列または類似のものの近くにあります。TODO SPIダンプ
TODO GDBアタッチ????
/etc/rc/etc/rc.local/etc/rc.conf を参照して情報を確認/etc/rc.d/ を実行/etc/inittab にある
runlevel
1:シングルユーザーモード、rootシェル、パスワードなし、デーモン実行なし3:テキストベースのマルチユーザーモード、ログインプロンプト5:グラフィカルログイン/etc/init.d/ を実行/sbin/init を分析し、上記のタイプを識別する情報を検索するfile コマンドを使用すれば簡単QEMU実行可能形式の場所を確認:qemu-system-$PROCESSOR$ARCHITECTURE
qemu-system-mipselプロセッサファミリがわかっている場合、それを指定してQEMUが環境をより適切にエミュレートできるようにすることができます。
$QEMUBIN -cpu helpカーネルとルートファイルシステムが必要です。
カーネルバージョン、libc バージョン、および対象の実行可能ファイルが使用するライブラリのリストを見つけます(readelf -d $EXECUTABLE)。
libfoo.X.Y.Z(X.Y.Z がバージョン)
X 互換性のないABI200kΩGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)TX UARTピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)。電圧が変動している場合、このピンはおそらくTX(データ送信中)RX UARTピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)。電圧が0に固定されている場合、このピンはおそらくRX(データ受信待ち)表
| PIN | GND resistance | VCC resistance | V | Notes |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
例
115200)Hはヘルプ表示機能。あらゆる場面で使用するGNDをJtagulatorGNDに、ボードのピン1,2,3をJtagulatorのチャンネル1,2,3に接続V: 動作電圧を設定U: UART識別メニューに入るU: 識別を開始Text string to output: defaultStarting channel: ボードのピン1を接続したチャンネルEnding channel: ボードのピン3を接続したチャンネルIgnore non-printable characters: Yesscreen /dev/ttyUSB0 $BAUDRATEでTTYに接続
$BAUDRATEはこちらにあるもののいずれか$BAUDRATE
1152009600576003840019200$BAUDRATEを間違えると、文字化けが見えるか、何も見えない可能性があるctrl + a -> k -> y: close screen\r\nか\nで間違っている可能性がある
pyserial(Pythonのシリアル通信用ライブラリ)を使用する。例:
#!/usr/bin/env python3
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
ser.write(b"HELLO\r\n")
ser.write(b"HELLO\n")
TDO (テストデータ出力): チップからデータが出るピン。データ入力ピンと同様、通信プロトコルはJTAGによって定義されていません。TRST (テストリセット、オプション): この信号はJTAGを既知の良好な状態にリセットするために使用されます。5/6ピンの列、または10、12、14、20ピンの二列を探す
GNDへの参照を見つける
GNDVCCへの参照を見つける
VCCGNDに対する抵抗をテストする(マルチメータを抵抗測定に、通常200k)VCCに対する抵抗をテストする(マルチメータを抵抗測定に、通常200kΩ)GNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)表
115200)H はヘルプ表示機能です。あらゆる場面で使用してください。GND をJtagulatorの GND に、ボードのピン 1,2,3... をJtagulatorのチャンネル 1,2,3... に接続します。V: 動作電圧を設定します。J: JTAG識別メニューに入ります。I: IDCODEスキャンで識別します。TDIは見つかりません(高速)。識別するピンが多い場合に適しています。B: BYPASSスキャンで識別します。TDIを見つけます(低速)。識別するピンが少ない場合に適しています。Starting channel: ボードのピン 1 を接続したチャンネル。Ending channel: ボードのピン n を接続したチャンネル。Already known pins: いいえ。ただし、すでにいくつかのピンがわかっている場合は処理を高速化できます。VCCの間に約300Ωまたは1kΩの抵抗を挿入することで解決できます。reset:CPUをリセットreg:CPUレジスタを読み取りflash info bank $BANKID または flash info $BANKID:フラッシュメモリバンク $BANKID の情報を表示(バンク=メモリの塊だと思います)flash list:flash bank($BOARDCONFIGFILE内)を使用して宣言された各デバイスの連想配列のリストを、0から番号付けして取得します。flash banks:flash bank($BOARDCONFIGFILE内)を使用して宣言された各デバイスの1行の概要を、0から番号付けして表示します。flash write_image erase "$BINTOWRITE" $ADDRTOSTART:フラッシュメモリへの書き込み
$BINTOWRITE:bin(バイナリ)、ihex(Intel hex)、elf(ELFファイル)、s19(Motorola s19)、mem... などが可能です。$ADDRTOSTART:書き込みを開始するアドレス(デフォルトは 0 だと思います)。flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP:メモリのダンプ
$OUTFILE:ダンプを保存するバイナリファイル$ADDRTOSTART:読み取りを開始するアドレス(デフォルトは 0 だと思います)。$SIZETODUMP:ダンプするバイト数BusyBoxhelp コマンドはあなたの味方です。binwalk、file、hexdump -C を使用して、ダンプされたファイルが正常かどうか、圧縮または暗号化されているかを確認します。
binwalk -E でファイルのエントロピーを分析します。
1 に近い:ランダム、圧縮、または暗号化されたファイル1 未満:通常の実行可能ファイルまたはファイルbinwalk -e を使用して、識別可能なファイルセグメントを抽出します。binwalk がダンプイメージを完全に理解できない場合、EEPROMパーティションテーブル(先に見つかっていれば)を使用して、ダンプイメージを複数の有用なイメージに手動で分割できます。
dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITEsha1sum、md5sum、または binwalk -W -i を使用してイメージを比較します(例えば、同じイメージだと思われる場合)。binwalk(または、特定のカーネルイメージの構造がオンラインでわかれば dd)を使用してそのコンポーネントを再度抽出し、ルートファイルシステムを読み取ることができます。fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
fakeroot:偽のルート環境を作成します。ファイルパーミッション、デバイスファイルなどのエミュレーションに役立ちます。
-s fakeroot.dat:偽のルート環境を保存し、後で fakeroot -i fakeroot.dat bash コマンドで復元できるようにします。usquashfs:squashfs ファイルシステムを抽出します(あなたのケースでは異なる可能性があります)。
-d squashfs-root:出力先フォルダu04-sqfs.dat:抽出するファイルシステムイメージfactory mode 文字列を探す。デバイスをファクトリモード(存在する場合)にできれば、ハッキングがはるかに簡単になります。grepfindxargsstringsY 後方互換性のあるABIZ AI変更なしX.Y が必要です。
X、より高い Yビルドシステムを使用してビルドする(機能を選択し、依存関係を自動追跡)
エミュレーションを開始する
#!/bin/bash
# This script will build an environment without password for the user root
export QEMU_AUDIO_DRV="none" # ignore audio drivers
qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
-m $RAMSIZE \
-kernel $KERNELPATH \
-nographic \ # No GUI
-hda $FILESYSTEM \
-net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
-net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
-no-reboot \ # Terminate the machine when is halted
-append "root=/dev/hda console=uart0" # Set root filesystem and console
LD_LIBRARY_PATH を次のように設定します:export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER#!/bin/bash
# Part 1: Identify bytes for kernel module
modprobe nandsim first_id_byte=$FIRSTBYTE \
second_id_byte=$SECONDBYTE \
third_id_byte=$THIRDBYTE \
fourth_id_byte=$FOURTHBYTE \
cache_file=/root/nandsim.bin \
parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
# Part 2: Erase partitions created (analyze EEPROM partitions)
flash_erase /dev/mtd0 0 8
flash_erase /dev/mtd1 0 20
# ...
# Part 3: Load partitions dumped from device in the ones just created
nandwrite /dev/mtd0 part0.bin
nandwrite /dev/mtd1 part1.bin
# ...
# Part 4: Create mountpoint for filesystem and attach (if UBIFS)
mkdir /mnt/filesystem
ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
```# 第5部: マウント
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND IDを探します。バイトは最初、2番目、4番目の順で出力されます。writesize、oobsize、erasesize、iowidthを使用して、こちらで正しいコマンドを見つけることもできます。flash_eraseコマンドの最後の数値は、erasesize(parts=x,y,z,...と同じ)に関連したサイズです。-O: ボリュームIDヘッダのオフセットを指定します。値が間違っていると、システムは正しい値を教えてくれます。それでも、512、1024、2048などの異なる値を試すことができます(試行錯誤)。-m: mtdデバイス番号(ポイント3を参照)-d: UBIデバイス番号(ポイント5を参照)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L(またはmanを参照)でそのインタプリタが含まれているフォルダのパスを渡す
readelf -l $EXECUTABLEを使用するuClibc、uClibc-ng、musl、dietlibc...)make manualを実行してbuildrootのマニュアルを作成するmake helpを使用すると、buildrootがサポートするすべてのデバイス(ボード)が表示される。make $YOURBOARDNAMEでボードのbuildroot設定ファイルを作成するmake menuconfig(テキストベース)またはmake xconfig(GUI)を使用して、ビルドに追加するカーネルモジュールを選択する。ここではmake xconfigを使用する
Edit->Findでモジュールを検索するTarget options
Show options and packages that are deprecated or obsolete にチェックBuild packages with debugging symbols にチェックし、最高の debug level を選択Strip command for binaries on target を None にチェックGCC optimization level を 0 にチェックToolchain
Toolchain type を Buildroot toolchain にチェックKernel headers を Manually specified linux version にチェックCustom kernel headers series を $DEVICEKERNELVERSION に設定Linux version を $DEVICEKERNELVERSION に設定C library を $DEVICECLIBRARY にチェック$DEVICECLIBRARY version を $DEVICECLIBRARY $DEVICELIBRARYVERSION にチェックEnable large files にチェックSystem configuration
Passwords encoding を MD5 にチェックInit system を $DEVICEINITSYSTEM(または BusyBox)にチェック/dev management を Dynamic using devtmpfs only にチェック/bin/sh を Busybox default shell にチェックInstall timezone info にチェックKernel
Kernel version を $DEVICEKERNELVERSION に設定Kernel binary format を vmlinux にチェックTarget packages
Compressors and decompressors
bzip2 と xz-utilsDebugging profiling and benchmark
gdb と full debugger にチェックDevelopment tools
Filesystem and flash utilities
mtd, jffs2 and ubi/ubifs tools(または必要なもの)Libraries
Crypto
libsha1Networking applications
rsync と必要なものShell and utilities
fileFilesystem images
ext2Host utilities(ターゲットデバイスではなく、ホストデバイスについて)
host mtd, jffs2 and ubi/ubifs toolshost util-linuxmake savedconfig を使用するmake linux-menuconfig(テキストベース)または make linux-xconfig(GUI)でカーネルを設定する。ここではCLIバージョンを使用する
Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulatorKernel type -> Device drivers -> Memory technology device (MTD) support -> -> uclibc-menuconfig(常に同様)で uClibc(またはCライブラリ)を設定する
Development/Debugging options -> Enable debugging symbols。これが機能しない場合(コンパイルエラー)は、Development/Debugging options -> (Wall) compiler warnings -> -Wall -ggdb -g3 を追加する
-ggdb: GDBで使用するデバッグ情報を提供する-g3: 追加のデバッグ情報を提供するSavemake。問題があれば戻って繰り返す
-fPIC を使用する必要がある
Toolchain -> Additional gcc options に --enable-shared を追加するか、buildrootにパッチを適用するbr2)
+-- board/
| +-- <company>/ (常に使われるわけではない)
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- kernel-defconfig (カーネル設定ファイル)
| +-- <その他の設定ファイル>
| +-- post_build.sh (イメージ構築直前に実行され、ルートファイルシステムをイメージにコピーするのに便利)
| +-- post_image.sh
| +-- rootfs_overlay/ (ここにあるものはすべて最終イメージにコピーされる)
| | +-- etc/
| | +-- <何らかのファイル>
| +-- patches/
| +-- foo/
| | +-- <何らかのパッチ>
| +-- libbar/
| +-- <その他のパッチ>
|
+-- configs/
| +-- <boardname>_defconfig (ボードのbuildroot設定)
| +-- uClibc.config (オプション)
+-- patches/
| +-- (ここに適用するパッチ)
|
+-- Config.in (br2-externalツリーを使用する場合)
+-- external.mk (br2-externalツリーを使用する場合)
+-- external.desc (br2-externalツリーを使用する場合)
make BR2_EXTERNAL=$PATHTOEXTTREE $COMMANDmake BR2_EXTERNAL=$PATHTOEXTTREE savedefconfigmake BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfigmake BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig| PIN | GND resistance | VCC resistance | V | Notes |
|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 1.6-3.3V on boot - TX |
| 3 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 3.3V | 0V on boot - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
| PIN | GND resistance | VCC resistance | V | Notes |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
例
| PIN | GND resistance | VCC resistance | V | Notes |
|---|---|---|---|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 2.1V | High impedance, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | Not connected? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | Not connected? |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |
Enable IPv6 にチェックEnable RPC にチェックEnable WCHAR にチェックThread library implementation を linuxthreads にチェックThread library debugging にチェックBuild cross gdb for the host にチェックTUI support にチェックPython support にチェックGDB debugger version を $LATESTGDBVERSION にチェックlibssh2opensslJSON/XML
expatjson-cUBI - Unsorted block imagesEnable UBIFile systems -> Miscellaneous filesystem -> JFFS2 supportFile systems -> Miscellaneous filesystem -> UBIFS filesystem supportSave