
ورقة غش اختراق العتاد
[[TOC]]
250-350 CVCC و GND بشكل جيد مفيد جداًGND، IN أو RX، OUT أو TX و VCC3/4 دبابيس على PCB
GND
GNDVCC
VCCGND (مقياس متعدد لقياس المقاومة، عادة 200k)3.3V أو 5V)، وإلا ستتلف اللوحة أو المحول التسلسليRX من اللوحة بـ TX من المحول و TX من اللوحة بـ RX من المحول
VCCsudo lsusb لتحديد موقع المحولls -lart /dev لتحديد جميع ملفات الجهاز؛ يجب أن يكون جهازنا من آخرها، عادة ttyUSB0dialout (أو أن نكون root)، للتحقق من مجموعاتنا 0 أو 1TCK، TDI، TDO، TMS و TRST (اختياري)
TCK (ساعة الاختبار): الطبّال، أو بندول الإيقاع الذي يحدد سرعة المتحكم. الجهد على هذا الدبوس ينبض ببساطة لأعلى ولأسفل في إيقاع ثابت وثابت. في كل "نبضة" من الساعة، يتخذ المتحكم إجراءً واحداً.TMS (اختيار وضع الاختبار): الجهد على دبوس اختيار الوضع يتحكم في الإجراء الذي يتخذه JTAG. من خلال التلاعب بالجهد على هذا الدبوس، تخبر JTAG بما تريد أن يفعله.TDI (إدخال بيانات الاختبار): الدبوس الذي يغذي البيانات إلى الشريحة. معيار JTAG لا يحدد بروتوكولات للاتصال عبر هذا الدبوس. ذلك متروك للشركة المصنعة. بقدر ما يهم JTAG، هذا الدبوس هو ببساطة طريقة دخول لـ و إلى الشريحة. ما تفعله الشريحة بها لا يهم JTAG.3.3V أو 5V)، وإلا ستتلف اللوحة أو المحول التسلسليopenocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE: مرجع لوحة Focaccia$BOARDCONFIGFILE: ملف تكوين اللوحة التي تخترقها (مفيد لكن ربما لن يكون لديك، اختياري)
/usr/local، ربما هنا تجد بعض $BOARDCONFIGFILE المفيدةtelnet localhost 4444
U-Boot 1.1.3)ASIC MT7621A...)mtd->writesize=2048: حجم الصفحة (بايت)mtd->oobsize=64: بيانات تستخدم لتصحيح الأخطاء (بايت)devinfo.iowidth=8: بيانات مكتوبة/مقروءة لكل عملية (بايت)mtd->erasesize=131072: عدد مرات الكتابة المتبقية في EEPROM؟ (تقريباً)TODO تفريغ SPI
TODO إرفاق GDB????
/etc/rc/etc/rc.local/etc/rc.conf للحصول على معلومات/etc/rc.d//etc/inittab
runlevel
1: وضع المستخدم الفردي، شيل جذر، بدون كلمة مرور، بدون تشغيل أي خلفية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 ( هو الإصدار)
NAND ID، البايتات المطبوعة تكون بالترتيب: البايت الأول والثاني والرابعwritesize, oobsize, erasesize, iowidth للعثور هنا على الأمر الصحيحflash_erase هو حجمها المرتبط بـ erasesize (نفس parts=x,y,z,...)-O: تحديد إزاحة رأس معرف الحجم، إذا كان خاطئًا يجب أن يخبرك النظام بالقيمة الصحيحة على أي حال، يمكنك تجربة قيم مختلفة مثل 512, 1024, 2048 (جرب وخطئ)-m: رقم جهاز mtd (انظر النقطة 3)-d: رقم جهاز UBI (انظر النقطة 5)qemu-$PROCESSOR$ARCHITECTURE
qemu-mips64-L (أو راجع man)
readelf -l $EXECUTABLEuClibc, uClibc-ng, musl, dietlibc...)VCC (مقياس متعدد لقياس المقاومة، عادة 200kOhm)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 للوحة بـ GND لـ Jtagulator، ودبابيس اللوحة 1,2,3 بقنوات Jtagulator 1,2,3V: ضبط جهد العملU: الدخول إلى قائمة تعريف UARTU: بدء التعريفText string to output: defaultStarting channel: القناة التي نضع فيها الدبوس 1 من اللوحةEnding channel: القناة التي نضع فيها الدبوس 3 من اللوحةIgnore non-printable characters: نعمgroups $USERscreen /dev/ttyUSB0 $BAUDRATE للاتصال بـ TTY
$BAUDRATE يمكن أن يكون واحداً من الموجودين هنا$BAUDRATE
1152009600576003840019200$BAUDRATE قد نرى هراء أو حتى لا شيءctrl + a -> k -> y: إغلاق الشاشة (screen)\r\n أم \n؟
pyserial، مكتبة بايثون للاتصال التسلسلي، مثال:
#!/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")
10TDO (إخراج بيانات الاختبار): الدبوس للبيانات الخارجة من الشريحة. مثل دبوس إدخال البيانات، لم تحدد JTAG بروتوكولات الاتصال.TRST (إعادة تعيين الاختبار، اختياري): تُستخدم هذه الإشارة لإعادة تعيين JTAG إلى حالة جيدة معروفة.5/6 دبابيس أو صف مزدوج من 10، 12، 14، 20 دبوساً على PCB
GND
GNDVCC
VCCGND (مقياس متعدد لقياس المقاومة، عادة 200k)VCC (مقياس متعدد لقياس المقاومة، عادة 200kOhm)GND (مقياس متعدد لقياس الجهد، عادة 20V)جدول
115200)H هي وظيفة طباعة المساعدة، استخدمها في كل مكانGND للوحة بـ GND في Jtagulator، أطراف اللوحة 1,2,3... بقنوات Jtagulator 1,2,3...V: ضبط جهد التشغيلJ: الدخول إلى قائمة تعريف JTAGI: التعريف باستخدام مسح IDCODE، لن يجد TDI (سريع)، أفضل إذا كان لدي العديد من الأطراف للتعرف عليهاB: التعريف باستخدام مسح BYPASS، سيجد TDI (بطيء)، أفضل إذا كان لدي أطراف أقل للتعرف عليهاStarting channel: القناة التي نضع فيها الطرف 1 للوحةEnding channel: القناة التي نضع فيها الطرف n للوحةAlready known pins: لا، لكنه قد يسرع العملية إذا كنا نعرف بعض الأطراف مسبقًا300Ohm أو 1kOhm بين هذا الطرف و VCChalt: إيقاف CPU (مثل التجميد)
reset: إعادة تعيين CPUreg: قراءة سجلات CPUflash info bank $BANKID أو flash info $BANKID: طباعة معلومات عن بنك ذاكرة الفلاش $BANKID (أعتقد أن البنوك = أجزاء من الذاكرة)flash list: استرجاع قائمة من المصفوفات الترابطية لكل جهاز تم تعريفه باستخدام flash bank (في $BOARDCONFIGFILE)، مرقمة من الصفرflash banks: طباعة ملخص من سطر واحد لكل جهاز تم تعريفه باستخدام flash bank (في $BOARDCONFIGFILE)، مرقمة من الصفر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: عدد البايتات المراد تفريغهاinit started أو شيء مشابه، ربما سيكون بالقرب من سلسلة BusyBox أو ما يشابههاhelp هو صديقك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 bashusquashfs: استخراج نظام الملفات squashfs (قد يكون مختلفاً في حالتك)
-d squashfs-root: المجلد الوجهةu04-sqfs.dat: صورة نظام الملفات المراد استخراجهاfactory mode؛ إذا نجحنا في وضع الجهاز في وضع المصنع (إذا كان موجوداً) فإن اختراقه يصبح أسهل بكثيرgrepfindxargsstringsX.Y.ZX واجهة ثنائية غير متوافقةY واجهة ثنائية متوافقة مع الإصدارات السابقةZ لا تغييرات في الواجهة الثنائية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
make manual لإنشاء دليل buildrootmake help، يطبع buildroot جميع الأجهزة المدعومة (اللوحات)؛ استخدم make $YOURBOARDNAME لإنشاء ملف تكوين buildroot للوحة الخاصة بكmake menuconfig (نصي) أو make xconfig (واجهة رسومية) لاختيار وحدات النواة المراد إضافتها إلى بنائنا، سنستخدم make xconfig
Edit->Find للبحث عن الوحداتTarget options
Show options and packages that are deprecated or obsoleteBuild packages with debugging symbols بأعلى debug levelStrip command for binaries on target إلى NoneGCC optimization level إلى 0Toolchain
Toolchain type إلى Buildroot toolchainKernel headers إلى Manually specified linux versionCustom kernel headers series إلى $DEVICEKERNELVERSIONLinux version إلى $DEVICEKERNELVERSIONC library إلى $DEVICECLIBRARY$DEVICECLIBRARY version إلى $DEVICECLIBRARY $DEVICELIBRARYVERSIONEnable large filesSystem configuration
Passwords encoding إلى MD5Init system إلى $DEVICEINITSYSTEM (أو BusyBox)/dev management إلى Dynamic using devtmpfs only/bin/sh إلى Busybox default shellInstall timezone infoKernel
Kernel version إلى $DEVICEKERNELVERSIONKernel binary format إلى vmlinuxTarget packages
Compressors and decompressors
bzip2 و xz-utilsDebugging profiling and benchmark
gdb و full debuggerDevelopment 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 savedconfigmake linux-menuconfig (نصي) أو make linux-xconfig (واجهة رسومية)، هنا سنستخدم إصدار سطر الأوامر
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 -> UBI - Unsorted block images -> Enable UBIFile systems -> Miscellaneous filesystem -> JFFS2 supportFile systems -> Miscellaneous filesystem -> UBIFS filesystem supportSaveuClibc (أو مكتبة c الخاصة بك) باستخدام uclibc-menuconfig (كالمعتاد)
Development/Debugging options -> Enable debugging symbols، إذا لم يعمل هذا (أخطاء التجميع) فاستخدم Development/Debugging options -> (Wall) compiler warnings -> أضف -Wall -ggdb -g3
-ggdb: يوفر معلومات التصحيح لاستخدامها مع GDB-g3: يوفر معلومات تصحيح إضافيةSavemake، إذا ظهرت مشاكل، عد إلى الخلف
Need to use -fPIC
--enable-shared في وحدات النواة (النقطة 7) تحت Toolchain -> Additional gcc options أو قم بتصحيح buildrootbr2)
+-- board/
| +-- <company>/ (ليس دائمًا مستخدمًا)
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- kernel-defconfig (ملف تكوين النواة)
| +-- <ملفات تكوين أخرى>
| +-- post_build.sh (يُنفذ قبل بناء الصورة مباشرة، مفيد لنسخ نظام الملفات الجذر إلى الصورة)
| +-- post_image.sh
| +-- rootfs_overlay/ (سيتم نسخ كل شيء هنا في الصورة النهائية)
| | +-- etc/
| | +-- <some file>
| +-- patches/
| +-- foo/
| | +-- <some patch>
| +-- libbar/
| +-- <some other patches>
|
+-- 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 | مقاومة عالية, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | غير متصل؟ |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (multimeter 1) | INFOhm (multimeter 1) | 0V | غير متصل؟ |
| 9 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 10 | 0Ohm | 90Ohm | 0V | GND |
Enable IPv6Enable RPCEnable WCHARThread library implementation إلى linuxthreadsThread library debuggingBuild cross gdb for the hostTUI supportPython supportGDB debugger version إلى $LATESTGDBVERSIONlibssh2opensslJSON/XML
expatjson-c