
하드웨어 해킹 치트시트
[[TOC]]
250-350 CGND, IN 또는 RX, OUT 또는 TX 및 VCC를 검색3/4 핀을 검색
GND 기준점 찾기
GND에 연결됨VCC 기준점 찾기
VCC에 한 점이 있습니다GND에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200k)VCC에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 )3.3V 또는 5V)을 선택하세요, 그렇지 않으면 보드나 직렬 어댑터가 손상됩니다RX를 어댑터 TX에 연결하고 보드 TX를 어댑터 RX에 연결합니다
VCC 핀을 연결할 필요는 없습니다sudo lsusb로 어댑터를 찾습니다ls -lart /dev로 모든 디바이스 파일을 찾습니다; 우리 것은 마지막 몇 개 중 하나여야 하며, 보통 ttyUSB0입니다dialout 그룹에 속해야 합니다 (또는 root여야 함), 그룹을 확인하려면 groups $USER0 또는 1로 설정TCK, TDI, TDO, TMS 및 TRST (선택 사항) 검색
TCK (Test Clock): 컨트롤러의 속도를 결정하는 드러머 또는 메트로놈. 이 핀의 전압은 리드미컬하고 꾸준한 박자로 위아래로 맥동합니다. 클록의 각 "박자"마다 컨트롤러는 단일 동작을 수행합니다.TMS (Test Mode Select): 모드 선택 핀의 전압은 JTAG이 수행하는 동작을 제어합니다. 이 핀의 전압을 조작하여 JTAG에게 원하는 작업을 지시합니다.TDI (Test Data-In): 칩으로 데이터를 공급하는 핀. JTAG 표준은 이 핀을 통한 통신 프로토콜을 정의하지 않습니다. 이는 제조업체에게 달려 있습니다. JTAG이 보기에는 이 핀은 단순히 1과 이 칩 안으로 들어가는 경로일 뿐입니다. 칩이 그 값들로 무엇을 하는지는 JTAG과 무관합니다.3.3V 또는 5V)을 선택하십시오. 그렇지 않으면 보드나 시리얼 어댑터가 손상됩니다openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
$FT232HCONFIGFILE: Focaccia board 참조$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: 작업당 읽기/쓰기 데이터(바이트)mtd->erasesize=131072: EEPROM 남은 쓰기 횟수? (대략)init started 또는 유사한 문자열을 검색하십시오. 아마도 문자열 또는 유사한 것 근처에 있을 것입니다TODO SPI 덤프
TODO GDB ATTACH????
/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 호환되지 않는 ABI200kOhmGND에 대한 UART 핀 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V)TX UART 핀의 GND에 대한 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V); 전압이 진동하면 이 핀은 아마 TX입니다 (데이터를 보내고 있기 때문)RX UART 핀의 GND에 대한 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V); 전압이 0에 고정되어 있으면 이 핀은 아마 RX입니다 (데이터 수신을 기다리고 있기 때문)표
| PIN | GND 저항 | VCC 저항 | V | 참고 |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
예시
115200)H는 도움말 출력 기능입니다, 어디서나 사용하세요GND를 Jtagulator GND에 연결하고, 보드 핀 1,2,3을 Jtagulator 채널 1,2,3에 연결합니다V: 작동 전압 설정U: UART 식별 메뉴 진입U: 식별 시작Text string to output: 기본값Starting channel: 보드의 핀 1을 연결한 채널Ending channel: 보드의 핀 3을 연결한 채널Ignore non-printable characters: Yesscreen /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")
0TDO (Test Data-Out): 칩에서 나오는 데이터용 핀. 데이터 입력 핀과 마찬가지로 통신 프로토콜은 JTAG에 의해 정의되지 않습니다.TRST (Test Reset, 선택 사항): 이 신호는 JTAG을 알려진 양호한 상태로 리셋하는 데 사용됩니다.5/6 핀 행 또는 10, 12, 14, 20 핀의 이중 행을 검색
GND 기준점 찾기
GND에 연결됨VCC 기준점 찾기
VCC에 한 점이 있습니다GND에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200k)VCC에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200kOhm)GND에 대한 JTAG 핀 전압 테스트 (멀티미터를 전압 측정으로, 보통 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 사이에 약 300Ohm 또는 1kOhm 저항을 연결하면 해결할 수 있습니다reset: CPU 리셋reg: CPU 레지스터 읽기flash info bank $BANKID 또는 flash info $BANKID: 플래시 메모리 뱅크 $BANKID에 대한 정보 출력(뱅크 = 메모리 청크라고 생각함)flash list: flash bank($BOARDCONFIGFILE에서)로 선언된 각 장치에 대한 연관 배열 목록을 0부터 번호를 매겨 검색flash banks: flash bank($BOARDCONFIGFILE에서)로 선언된 각 장치에 대한 한 줄 요약을 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 ABI 변경 없음X.Y가 필요합니다
X, 더 높은 Y빌드 시스템을 사용하여 빌드(기능 선택 및 종속성 자동 추적)
에뮬레이션 시작
#!/bin/bash
# 이 스크립트는 root 사용자에 대한 암호 없이 환경을 구축합니다
export QEMU_AUDIO_DRV="none" # 오디오 드라이버 무시
qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # 포인트 2 참조
-m $RAMSIZE \
-kernel $KERNELPATH \
-nographic \ # GUI 없음
-hda $FILESYSTEM \
-net nic,model=$NETCARDMODEL \ # 네트워크 카드 모델, 드라이버는 커널에 포함되어야 함
-net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222는 ssh, 9000은 GDB 서버용
-no-reboot \ # 시스템이 중지되면 종료
-append "root=/dev/hda console=uart0" # 루트 파일시스템과 콘솔 설정
LD_LIBRARY_PATH를 설정하십시오: export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER#!/bin/bash
# 1부: 커널 모듈용 바이트 식별
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,... # 소거 블록 수로 파티션 크기 정의; 파티션 수는 장치에 따라 다르며, 파티션은 일반적으로 부팅 시 출력됨
# 2부: 생성된 파티션 소거 (EEPROM 파티션 분석)
flash_erase /dev/mtd0 0 8
flash_erase /dev/mtd1 0 20
# ...
# 3부: 장치에서 덤프한 파티션을 방금 생성한 파티션에 로드
nandwrite /dev/mtd0 part0.bin
nandwrite /dev/mtd1 part1.bin
# ...
# 4부: 파일시스템 마운트 지점 생성 및 연결 (UBIFS인 경우)
mkdir /mnt/filesystem
ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
```# Part 5: Mount
mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
NAND ID를 검색하세요. 출력되는 바이트는 첫 번째, 두 번째, 네 번째 바이트 순서입니다.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 선택debug level을 최고로 하여 Build packages with debugging symbols 선택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 실행. 문제가 있으면 다시 반복하십시오.
Need to use -fPIC
Toolchain -> Additional gcc options 아래에서 --enable-shared를 추가하거나 buildroot를 패치하십시오.br2)
+-- board/
| +-- <company>/ (not always used)
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- kernel-defconfig (kernel config file)
| +-- <other configuration files>
| +-- post_build.sh (executed just before building the image, useful to copy root filesystem into the image)
| +-- post_image.sh
| +-- rootfs_overlay/ (everythin here will be copied in the final image)
| | +-- etc/
| | +-- <some file>
| +-- patches/
| +-- foo/
| | +-- <some patch>
| +-- libbar/
| +-- <some other patches>
|
+-- configs/
| +-- <boardname>_defconfig (buildroot config for our board)
| +-- uClibc.config (optional)
+-- patches/
| +-- (here patches to be applied)
|
+-- Config.in (if using a br2-external tree)
+-- external.mk (if using a br2-external tree)
+-- external.desc (if using a br2-external tree)
make BR2_EXTERNAL=$PATHTOEXTTREE $COMMANDmake BR2_EXTERNAL=$PATHTOEXTTREE savedefconfigmake BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig| PIN | GND 저항 | VCC 저항 | V | 참고 |
|---|
| 1 | 30kOhm | 0Ohm | 3.3V | VCC |
| 2 | 4.7kOhm | 34kOhm | 3.3V | 부팅 시 1.6-3.3V - TX |
| 3 | INFOhm (멀티미터 1) | INFOhm (멀티미터 1) | 3.3V | 부팅 시 0V - RX |
| 4 | 0Ohm | 30kOhm | 0V | GND |
| PIN | GND 저항 | VCC 저항 | V | 참고 |
|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 | ||||
| 9 | ||||
| 10 | ||||
| ... |
예시
| PIN | GND 저항 | VCC 저항 | V | 참고 |
|---|---|---|---|---|
| 1 | 1kOhm | 1kOhm | 0V | |
| 2 | 0Ohm | 90Ohm | 0V | GND |
| 3 | INFOhm (멀티미터 1) | INFOhm (멀티미터 1) | 2.1V | 고임피던스, TDO? |
| 4 | 90Ohm | 0Ohm | 3.3V | VCC |
| 5 | 4.7kOhm | 4.7kOhm | 3.3V | |
| 6 | INFOhm (멀티미터 1) | INFOhm (멀티미터 1) | 0V | 연결 안 됨? |
| 7 | 5.7kOhm | 5.7kOhm | 3.3V | |
| 8 | INFOhm (멀티미터 1) | INFOhm (멀티미터 1) | 0V | 연결 안 됨? |
| 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 supportSavemake BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig