Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Hardware Hacking Cheatsheet — 하드웨어 해킹 치트시트 | Kitploit
도구/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
Embedded Systems SecurityIoT SecurityHardware SecurityLearning & EducationCurated ResourcesFirmware Analysis
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

하드웨어 해킹 치트시트

저장소 보기
235년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Hardware Hacking 치트시트

[[TOC]]

면책 조항

  • 저는 이런 것들을 배우려고 하는 초보자라서 100% 정확하지 않을 수도 있습니다
  • 영어가 서툴러서 죄송합니다

참고 사항

  • 가장 쉬운 경로 우선 방법론을 따르세요
  • 때로는 납땜을 해야 할 수도 있습니다; 여기에 빠르고 간단한 방법이 있습니다
    • PCB 비아에 와이어를 직접 납땜해야 할 수도 있습니다 (동영상)
      1. 커터를 사용하여 솔더 마스크 아래의 반짝이는 부분이 보일 때까지 PCB 표면을 긁습니다
      2. 유리 섬유 펜슬로 표면을 한 번 더 긁습니다
      3. IPA와 면봉으로 표면을 청소합니다
      4. 플럭스를 조금 바릅니다
      5. 와이어에 틴을 입히고 납땜합니다
    • 참고 사항
      • 납땜 인두 팁에 항상 틴을 입히세요
      • 온도: 250-350 C
      • PCB를 손으로 만지지 마세요

정보 수집 및 첫 상호 작용

  1. 기기 뒷면의 라벨을 보고 다음을 찾습니다
    • 모델명
    • 일련 번호
    • 기기를 브랜딩한 회사 (제조사가 아닐 수도 있음)
  2. 방금 수집한 정보를 사용하여 인터넷에서 검색합니다
    • 정보가 포함된 최고의 웹사이트
      • TechInfoDepot
      • OpenWRT
    • 다음을 검색하면 보통 많은 정보로 이어집니다
      • FCC ID (참조 웹사이트)
      • SOC 이름
      • 플래시 칩 이름 및 용량
      • RAM 칩 이름 및 용량
      • 기타 가능한 정보 소스
  3. 기기를 엽니다
    • 기기를 여는 방법에 대한 튜토리얼을 검색합니다
    • 일부 기기는 열지 못하게 접착되어 있을 수 있으니 조심히 다루세요
    • 때로는 회로의 일부를 덮는 방열판이 있는데, 가능하면 제거하세요
  4. 부품 식별
    • 회로 명칭을 더 읽기 쉽게 만들려면
      • 면봉 + 알코올을 사용하고, 알코올이 마르면 회로에 분필을 덮은 다음 청소하세요; 이제 회로 명칭을 읽을 수 있습니다
      • 돋보기를 사용하세요
    • 이러한 부품에 대한 정보와 데이터시트를 인터넷에서 검색하세요; 아무것도 찾지 못하면 중국 검색 엔진을 시도해 보세요
      • Baidu
      • Sogou
      • Haosou
    • 중요: VCC와 GND가 잘 노출된 부품을 찾는 것은 매우 유용합니다
  5. UART 인터페이스 찾기: 대략 TTY와 비슷함
    • 인터넷에서 검색
    • PCB에서 GND, IN 또는 RX, OUT 또는 TX 및 VCC를 검색
    • PCB에서 3/4 핀을 검색
      1. GND 기준점 찾기
        • 이전에 찾은 부품 사용
        • 보통 금속 판은 GND에 연결됨
      2. VCC 기준점 찾기
        • 이전에 찾은 부품 사용
        • 커패시터를 검색하세요, 보통 VCC에 한 점이 있습니다
      3. 아래 표를 채우면서 UART 후보 핀을 테스트합니다 (글머리 기호는 각각 표의 열입니다)
        1. UART 핀의 GND에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200k)
        2. UART 핀의 VCC에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 )
  6. UART로 연결: 직렬 어댑터 (UART -> USB)를 사용하여 컴퓨터를 통해 보드에 연결합니다
    • 선택한 직렬 어댑터: FT232H + Focaccia Board
    1. 적절한 전압 (3.3V 또는 5V)을 선택하세요, 그렇지 않으면 보드나 직렬 어댑터가 손상됩니다
    2. 보드 RX를 어댑터 TX에 연결하고 보드 TX를 어댑터 RX에 연결합니다
      • 참고: 보통 VCC 핀을 연결할 필요는 없습니다
    3. 어댑터를 컴퓨터에 연결합니다
      1. sudo lsusb로 어댑터를 찾습니다
      2. ls -lart /dev로 모든 디바이스 파일을 찾습니다; 우리 것은 마지막 몇 개 중 하나여야 하며, 보통 ttyUSB0입니다
      3. 이 디바이스에 접근하려면 dialout 그룹에 속해야 합니다 (또는 root여야 함), 그룹을 확인하려면 groups $USER
  7. JTAG 인터페이스 찾기
    • JTAG이란 무엇인가: JTAG 인터페이스는 제조업체가 칩의 핀 간 물리적 연결을 테스트할 수 있는 방법을 제공합니다. 전기 엔지니어가 JTAG을 사용하여 칩을 "디버그"한다고 말할 때, 그들은 전통적인 소프트웨어 디버깅과는 매우 다른 것을 말하는 것입니다. 그들은 칩 A의 핀 A가 칩 B의 핀 B에 물리적으로 연결되어 있고 모든 핀이 올바르게 작동하는지 확인하는 것을 말합니다. JTAG은 장치에 직접 하드웨어 액세스를 제공하므로 보안 연구에도 훌륭한 도구입니다.
    • JTAG 속성
      • 제어 가능성(Controllability): 내부 비트를 0 또는 1로 설정
      • 관찰 가능성(Observability): 내부 비트의 값 확인
      • ...그래서 EEPROM 읽기/쓰기
      • 인-서킷 디버깅: 회로에서 코드 디버깅 (예: OpenOCD 및 GDB 사용)
    • 인터넷에서 검색
    • PCB에서 TCK, TDI, TDO, TMS 및 TRST (선택 사항) 검색
      • TCK (Test Clock): 컨트롤러의 속도를 결정하는 드러머 또는 메트로놈. 이 핀의 전압은 리드미컬하고 꾸준한 박자로 위아래로 맥동합니다. 클록의 각 "박자"마다 컨트롤러는 단일 동작을 수행합니다.
      • TMS (Test Mode Select): 모드 선택 핀의 전압은 JTAG이 수행하는 동작을 제어합니다. 이 핀의 전압을 조작하여 JTAG에게 원하는 작업을 지시합니다.
      • TDI (Test Data-In): 칩으로 데이터를 공급하는 핀. JTAG 표준은 이 핀을 통한 통신 프로토콜을 정의하지 않습니다. 이는 제조업체에게 달려 있습니다. JTAG이 보기에는 이 핀은 단순히 1과 이 칩 안으로 들어가는 경로일 뿐입니다. 칩이 그 값들로 무엇을 하는지는 JTAG과 무관합니다.
  8. JTAG으로 연결: "시리얼 어댑터"(JTAG -> USB)를 사용하여 컴퓨터를 통해 보드에 연결
    • 선택한 "시리얼 어댑터": FT232H + Focaccia Board
    1. 적절한 전압(3.3V 또는 5V)을 선택하십시오. 그렇지 않으면 보드나 시리얼 어댑터가 손상됩니다
    2. 이전에 찾은 JTAG 핀아웃을 사용하여 모든 것을 연결하십시오
    3. UART 연결을 열어 둔 채(앞서 설명한 대로) 장치와 상호 작용하고 동작을 확인하십시오
    4. OpenOCD 실행
      • 첫 번째 창(OpenOCD "서버"): openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE: Focaccia board 참조
        • $BOARDCONFIGFILE: 해킹 중인 보드의 구성 파일(유용하지만 없을 수도 있음, 선택 사항)
          • 참고
            • 구성 파일은 /usr/local 안에 있습니다. 여기서 유용한 $BOARDCONFIGFILE을 찾을 수도 있습니다
            • 그렇지 않으면 인터넷에서 검색할 수 있습니다
            • 그렇지 않으면 직접 작성할 수 있습니다
            • TODO (직접 작성)
      • 두 번째 창(OpenOCD "클라이언트"): telnet localhost 4444
        • 유용한 명령
          • halt: CPU 중지(정지와 같음)
  9. 펌웨어 및 파일시스템 확보
    • 가능성(펌웨어와 파일시스템은 암호화되어 있을 수 있음)
      • 제조사 웹사이트에서 다운로드
      • 장치만 펌웨어를 다운로드할 수 있는 경우(업데이트를 통해) wireshark를 사용하여 네트워크를 스니핑해 정보 수집
      • 플래시 칩 프로그래머와 테스트 클립을 사용하여 EEPROM을 직접 읽기
      • 부트로더 덤프 명령
        1. UART 인터페이스에 출력되는 부트 로그 분석
          • 출력될 수 있고 우리가 관심 있는 정보(값은 예시일 뿐이지만 우리가 찾는 것이 무엇인지 설명함)
            • 부트로더 일반 정보
              • 부트로더 이름과 버전 검색(예: U-Boot 1.1.3)
            • SOC 정보
              • 추가 보드 정보(wifi, ethernet...), 자체 부트로더를 장착할 수 있음
              • SOC 모델(예: ASIC MT7621A...)
              • CPU 주파수
            • RAM 정보
              • mtd->writesize=2048: 페이지 크기(바이트)
              • mtd->oobsize=64: 오류 정정에 사용되는 데이터(바이트)
              • devinfo.iowidth=8: 작업당 읽기/쓰기 데이터(바이트)
              • RAM 용량
            • EEPROM 정보
              • mtd->erasesize=131072: EEPROM 남은 쓰기 횟수? (대략)
            • OS 커널 정보
              • 부트로더 로딩 정보를 찾으십시오. 여기서 파일시스템에 대한 정보를 찾을 수 있습니다
              • buildroot 버전을 찾으십시오. 회로 에뮬레이션 및 다양한 테스트에 도움이 됩니다
            • 파일시스템 정보
              • 부트로더 로딩 정보와 OS 시작 프로세스를 찾으십시오. 여기서 파일시스템에 대한 정보를 찾을 수 있습니다
            • EEPROM 파티션
              • OS 시작 프로세스를 찾으십시오. 여기서 EEPROM 파티션, 이름, 마운트 지점 및 RAM 길이에 대한 정보를 찾을 수 있습니다
              • 파티션이 중복되어 보이면 아마도 펌웨어 업그레이드를 위한 것입니다. 이유를 짐작할 수 있습니다
            • Init 프로세스 정보
              • init started 또는 유사한 문자열을 검색하십시오. 아마도 문자열 또는 유사한 것 근처에 있을 것입니다

TODO SPI 덤프

TODO GDB ATTACH????

리버스 엔지니어링

  1. Init 프로세스 유형 및 구성 파일
    • 유형
      • BSD 스타일
        • 다음 위치의 스크립트 실행으로 시작
          • /etc/rc
          • /etc/rc.local
        • 더 최신
          • /etc/rc.conf에서 정보 확인
          • /etc/rc.d/ 실행
      • System V (가장 널리 사용됨)
        • BusyBox가 시작됨
        • 구성 파일은 /etc/inittab에 있음
          • runlevel
            • 1: 단일 사용자 모드, root 셸, 암호 없음, 데몬 실행 안 함
            • 3: 텍스트 기반 다중 사용자 모드, 로그인 프롬프트
            • 5: 그래픽 로그인
          • 그 다음 init 시 수행되는 작업 목록이 있음
        • /etc/init.d/ 실행
      • Systemd (임베디드에서는 사용되지 않음)
    • 식별 방법
      • 부팅 시 출력됨
      • /sbin/init을 분석하여 위 유형을 식별하는 정보 검색

에뮬레이션 환경

  • 요구 사항
    • 바이너리 파일 CPU 아키텍처 파악
      • file 명령으로 간단히 확인
    • QEMU가 이 아키텍처를 지원해야 함
  • QEMU 에뮬레이션(모드)
    • 시스템 모드: 전체 시스템 에뮬레이션
      • 방법
        1. QEMU 실행 파일 형식 찾기: qemu-system-$PROCESSOR$ARCHITECTURE

          • 예: qemu-system-mipsel
        2. 프로세서 계열을 알면 지정하여 QEMU가 환경을 더 잘 에뮬레이션하도록 도울 수 있습니다

          • 지원되는 계열 목록: $QEMUBIN -cpu help
          • 일반적인 계열 CPU로 시작하는 것이 항상 좋고, 문제가 발생하면 더 깊이 파고들어 특정 CPU 계열을 사용하십시오
        3. 커널과 루트 파일시스템이 필요합니다

          • 참고
            • 장치 커널은 드라이버가 없어 적합하지 않음
            • IoT 세계에는 표준화가 없음
              • 커널 장치 트리 사용: 보드 드라이버를 정의하는 텍스트 파일
                • 커널은 부팅 시 이 파일을 로드하여 일반 드라이버를 사용 중인 보드에 맞게 조정
                • 많이 사용되지 않음
            • 그래서.. 커널과 파일시스템을 다시 빌드하십시오
          1. 커널 버전, libc 버전 및 관심 있는 실행 파일이 사용하는 라이브러리 목록을 찾으십시오 (readelf -d $EXECUTABLE)

            • 라이브러리 버전 형식: libfoo.X.Y.Z (X.Y.Z가 버전)
              • X 호환되지 않는 ABI

출처, 크레딧 및 감사

  • 하드웨어 해킹에 관한 놀라운 YouTube 튜토리얼 채널을 제공한 Valerio Di Giampietro (@valerio)에게 감사드립니다. 여기에 작성된 모든 내용은 대부분 이 비디오들에서 가져왔습니다.
  • 소중한 조언과 하드웨어 도구를 제공한 Luca Bongiorni (@LucaBongiorni)에게 감사드립니다.
  • 납땜 만화를 제공한 mightyohm.com에 감사드립니다.
  • 저를 도와준 Reddit hardwarehacking 커뮤니티에 감사드립니다.
    • [초보] PCB 직접 납땜 (아마도?)
  • 비아 납땜 튜토리얼을 제공한 Andrew Paul에게 감사드립니다.
  • Buildroot 매뉴얼
  • JTAG 설명
  • OpenOCD - 플래시 명령
  • OpenOCD + JTAG 정보
  • 하드웨어 해킹 치트시트 - 작은 PDF
  • OpenOCD
도구 다운로드
200kOhm
  • 기기에 전원을 켜고 GND에 대한 UART 핀 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V)
  • 기기에 전원을 켜고 부팅 중에 의심되는 TX UART 핀의 GND에 대한 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V); 전압이 진동하면 이 핀은 아마 TX입니다 (데이터를 보내고 있기 때문)
  • 기기에 전원을 켜고 부팅 중에 의심되는 RX UART 핀의 GND에 대한 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V); 전압이 0에 고정되어 있으면 이 핀은 아마 RX입니다 (데이터 수신을 기다리고 있기 때문)
    • 표

      PINGND 저항VCC 저항V참고
      1
      2
      3
      4
      • 예시

  • Jtagulator 사용
    1. 컴퓨터에 연결합니다 (baud rate: 115200)
    2. 중요: H는 도움말 출력 기능입니다, 어디서나 사용하세요
    3. 보드 GND를 Jtagulator GND에 연결하고, 보드 핀 1,2,3을 Jtagulator 채널 1,2,3에 연결합니다
    4. V: 작동 전압 설정
    5. U: UART 식별 메뉴 진입
    6. U: 식별 시작
    7. Text string to output: 기본값
    8. Starting channel: 보드의 핀 1을 연결한 채널
    9. Ending channel: 보드의 핀 3을 연결한 채널
    10. Ignore non-printable characters: Yes
    11. 완료!
  • TODO: - BurtleinaBoard + Busside 사용
  • screen /dev/ttyUSB0 $BAUDRATE로 TTY에 연결합니다
    • $BAUDRATE는 여기에서 찾은 것 중 하나일 수 있습니다
    • 가장 일반적인 $BAUDRATE
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • 중요: $BAUDRATE를 잘못 설정하면 알아볼 수 없는 문자나 아무것도 보이지 않을 수 있습니다
    • ctrl + a -> k -> y: screen 닫기
    • RX 핀이 작동하지 않는 것 같으면 (입력하고 Enter를 눌러도 아무 일도 일어나지 않으면) "return" 값이 잘못되었을 수 있습니다: \r\n 또는 \n?
      • 이 문제를 해결하려면 파이썬의 직렬 통신 라이브러리인 pyserial을 사용하세요, 예시:
        root@kitploit:~
        #!/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")
        
      • 문제가 지속되면 로직 분석기를 사용하세요 (여기 저렴한 제품)
    0
  • TDO (Test Data-Out): 칩에서 나오는 데이터용 핀. 데이터 입력 핀과 마찬가지로 통신 프로토콜은 JTAG에 의해 정의되지 않습니다.
  • TRST (Test Reset, 선택 사항): 이 신호는 JTAG을 알려진 양호한 상태로 리셋하는 데 사용됩니다.
  • PCB에서 5/6 핀 행 또는 10, 12, 14, 20 핀의 이중 행을 검색
    1. GND 기준점 찾기
      • 이전에 찾은 부품 사용
      • 보통 금속 판은 GND에 연결됨
    2. VCC 기준점 찾기
      • 이전에 찾은 부품 사용
      • 커패시터를 검색하세요, 보통 VCC에 한 점이 있습니다
    3. 아래 표를 채우면서 JTAG 후보 핀을 테스트합니다 (글머리 기호는 각각 표의 열입니다)
      1. JTAG 핀의 GND에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200k)
      2. JTAG 핀의 VCC에 대한 저항 테스트 (멀티미터를 저항 측정으로, 보통 200kOhm)
      3. 기기에 전원을 켜고 GND에 대한 JTAG 핀 전압 테스트 (멀티미터를 전압 측정으로, 보통 20V)
      • 표

    4. 찾은 값을 일반적으로 사용되는 JTAG 핀아웃과 비교하십시오. jtagtest에서 확인 가능
  • Jtagulator 사용하기
    1. 컴퓨터에 연결하십시오 (baud rate: 115200)
    2. 중요: H는 도움말 출력 기능입니다. 어디서든 사용하십시오
    3. 보드 GND를 Jtagulator GND에, 보드 핀 1,2,3...을 Jtagulator 채널 1,2,3...에 연결하십시오
    4. V: 동작 전압 설정
    5. J: JTAG 식별 메뉴 진입
    6. 두 가지 옵션이 있습니다
      • I: IDCODE 스캔으로 식별, TDI를 찾지 못함 (빠름), 식별할 핀이 많을 때 더 좋음
      • B: BYPASS 스캔으로 식별, TDI를 찾음 (느림), 식별할 핀이 적을 때 더 좋음
    7. Starting channel: 보드의 핀 1을 연결한 채널
    8. Ending channel: 보드의 핀 n을 연결한 채널
    9. Already known pins: 아니요. 하지만 일부 핀을 이미 알고 있다면 프로세스 속도를 높일 수 있음
    10. 시작하고 기다리십시오... 완료!
  • TODO: - BurtleinaBoard + Busside 사용
  • 중요
    • JTAG이 비활성화되었을 수 있습니다(하드웨어, 저항 제거). 따라서 멀티미터와 Jtagulator로 찾은 결과가 일치하지 않을 수 있습니다. 이 핀과 VCC 사이에 약 300Ohm 또는 1kOhm 저항을 연결하면 해결할 수 있습니다
    • JTAG이 비활성화되었을 수 있습니다(하드웨어, 저항 제거). 이 저항을 다시 장착하거나 저항 패드를 단락시켜 직접 연결하면 해결할 수 있습니다
    • JTAG이 비활성화되었을 수 있습니다(소프트웨어, 일부 값 설정)
    • JTAG이 비활성화되었을 수 있습니다(하드웨어, 퓨즈 차단... 이 경우 희망이 없음)
    • 모든 디버깅 작업 전에 반드시 수행해야 함
  • 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: 덤프할 바이트 수
  • 추가 정보:
    • OpenOCD PDF
    • OpenOCD HTML
  • TODO
  • BusyBox
  • 부트로더에 CLI가 있는가?
    • 부트로더 메뉴를 검색하십시오. 아마도 여기서 이 질문에 대한 답을 찾을 수 있을 것입니다
  • 부트로더 셸을 얻으려고 시도(자동으로 또는 UART를 통한 메뉴 출력으로)
  • 부트로더 셸 탐색
    • help 명령이 유용합니다
    • 메모리 내용을 덤프할 방법을 찾으십시오. python이 유용합니다
    • OOB 데이터(오류 코드 정정)는 덤프에 그리 유용하지 않습니다
  • 덤프된 데이터 분석
    • 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_WRITE
    • sha1sum, 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: 추출할 파일시스템 이미지
  • 흥미로운 바이너리 및 스크립트
    • init 프로세스가 시작하는 흥미로운 파일을 찾고 일반적으로 이름에 그치지 말고 어떤 바이너리가 실행되는지 깊이 살펴보고 분석하십시오. 가장 흥미로운 것은 비표준 바이너리입니다
    • factory mode 문자열을 찾으십시오. 장치를 팩토리 모드로 전환하는 데 성공하면(존재하는 경우) 해킹이 훨씬 쉬워집니다
    • 유용한 명령
      • 텍스트 편집기
      • grep
      • find
      • xargs
      • strings
  • Y 하위 호환 ABI
  • Z ABI 변경 없음
  • 따라서 원래 라이브러리와 동일한 X.Y가 필요합니다
    • 허용 가능: 동일한 X, 더 높은 Y
  • 빌드 시스템을 사용하여 빌드(기능 선택 및 종속성 자동 추적)

    • 최고의 빌드 시스템 선택
      • Yocto 프로젝트
      • Buildroot (최고)
      • OpenWRT 빌드 시스템
  • 에뮬레이션 시작

    • QEMU 에뮬레이션 스크립트
      root@kitploit:~
      #!/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
    • NAND EEPROM도 에뮬레이션할 수 있습니다
      root@kitploit:~
      #!/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
      
      1. 커널 모듈용 바이트 식별
        • 부팅 중에 보통 NAND 정보가 출력되며, 위 단계에서 그 정보를 확인하고 NAND ID를 검색하세요. 출력되는 바이트는 첫 번째, 두 번째, 네 번째 바이트 순서입니다.
        • 해당 정보는 EEPROM 데이터시트를 검색해도 찾을 수 있습니다.
        • 또한 writesize, oobsize, erasesize, iowidth를 사용하여 여기에서 올바른 명령을 찾을 수 있습니다.
        • 그렇지 않으면 시행착오를 겪으세요.
      2. 부팅 시 출력되는 EEPROM 파티션을 분석하여 크기와 이름을 확인합니다. flash_erase 명령의 마지막 숫자는 erasesize와 연관된 해당 크기입니다 (parts=x,y,z,...와 동일).
      3. 장치에서 덤프한 파티션을 방금 생성한 파티션에 로드합니다.
      4. 파일시스템용 마운트 포인트를 만들고 연결합니다.
        • -O: 볼륨 ID 헤더 오프셋을 지정합니다. 잘못된 경우에도 시스템이 올바른 값을 알려주므로, 어쨌든 512, 1024, 2048 같은 다른 값을 시도해 볼 수 있습니다 (시행착오).
        • -m: mtd 장치 번호 (포인트 3 참조)
        • -d: UBI 장치 번호 (포인트 5 참조)
      5. 마운트
  • 사용자 모드: wine처럼 바이너리 하나를 실행하여 우리 아키텍처로 "변환"합니다.
    • 참고
      • 그다지 안정적이지 않음
      • 이상한 결과를 낼 수 있음
    • 방법
      1. QEMU 실행 파일 형식 찾기: qemu-$PROCESSOR$ARCHITECTURE
        • 예: qemu-mips64
      2. QEMU가 인터프리터가 없다고 불평하면 -L 옵션으로 이 인터프리터가 포함된 폴더의 경로를 전달하십시오 (또는 man 참조).
        • 실행 파일에 사용되는 인터프리터를 확인하려면 readelf -l $EXECUTABLE을 사용하십시오.
  • 가상화 모드: 우리에게는 흥미롭지 않음
  • buildroot와 docker를 사용한 커널 및 루트 파일시스템 구축
    • 우리가 빌드한 커널은 (원래 커널 대비) 다음을 가져야 합니다
      • 동일한 커널 버전
      • 동일한 libc 버전 (uClibc, uClibc-ng, musl, dietlibc...)
      • (우리가 관심 있는 실행 파일의) 동일한 라이브러리 버전
    1. 우리 장치의 버전과 가장 가까운 buildroot 버전을 검색합니다.
      • 부팅 중 또는 덤프된 메모리를 살펴볼 때 사용된 buildroot 버전을 찾을 수 있는 경우도 있습니다 (장치가 buildroot로 빌드된 경우).
    2. 찾은 buildroot 버전과 호환되는 linux 버전을 찾고 docker 컨테이너를 생성합니다. 여기에 샘플 dockerfile이 있습니다 (buildroot를 실행하려면 패키지가 중요합니다).
    3. 선택한 buildroot 버전을 여기에서 다운로드하고 docker 컨테이너 공유 폴더 안에 넣습니다.
    4. docker 컨테이너를 실행하고 전환합니다.
    5. buildroot를 추출하고 make manual을 실행하여 buildroot 매뉴얼을 생성합니다.
    6. make help를 사용하면 buildroot가 지원되는 모든 장치(보드)를 출력합니다. make $YOURBOARDNAME을 실행하여 보드의 buildroot 구성 파일을 생성합니다.
    7. 빌드에 추가할 커널 모듈을 선택하려면 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-utils
          • Debugging profiling and benchmark
            • gdb 및 full debugger 선택
          • Development tools
            • 필요한 것들
          • Filesystem and flash utilities
            • mtd, jffs2 and ubi/ubifs tools (또는 필요한 것들)
          • Libraries
            • 일반적으로 필요한 것들 (아래 제안 사항)
            • Crypto
              • libsha1
        • Networking applications
          • rsync 및 필요한 것들
        • Shell and utilities
          • file
        • Filesystem images
          • ext2
        • Host utilities (대상 장치에 대한 것이 아니라 호스트 장치에 대한 것입니다)
          • host mtd, jffs2 and ubi/ubifs tools
          • host util-linux
      • 저장(SAVE)하는 것을 잊지 마세요
    8. 방금 정의한 구성을 영구적으로 저장하려면 make savedconfig를 사용합니다.
    9. 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 simulator
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> ->
    10. uclibc-menuconfig를 사용하여 uClibc(또는 사용자의 C 라이브러리)를 구성합니다 (항상 그렇듯이).
      • 디버깅 활성화: Development/Debugging options -> Enable debugging symbols 선택. 이 방법이 작동하지 않으면(컴파일 오류) Development/Debugging options -> (Wall) compiler warnings -> -Wall -ggdb -g3 추가
        • -ggdb: GDB에서 사용할 디버깅 정보를 제공합니다.
        • -g3: 추가 디버깅 정보를 제공합니다.
      • Save
      • 우리 장치와 동일한 기능을 활성화합니다 (시행착오를 겪으며, 오류가 발생하면 조사한 다음 필요한 기능으로 다시 빌드하십시오).
    11. make 실행. 문제가 있으면 다시 반복하십시오.
      • 발생 가능한 컴파일 오류
        • Need to use -fPIC
          • 커널 모듈(포인트 7)의 Toolchain -> Additional gcc options 아래에서 --enable-shared를 추가하거나 buildroot를 패치하십시오.
    • git으로 buildroot 구성 파일 저장하기
      • 외부 트리 구성 (buildroot가 이해할 수 있는 파일 트리 보기) (br2)
        root@kitploit:~
        +-- 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)
        
      • 외부 트리를 사용하려면 buildroot를 다음과 같이 호출합니다: make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • buildroot 구성을 외부 트리에 저장하려면: make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
      • 커널 구성을 외부 트리에 저장하려면: make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
  • PINGND 저항VCC 저항V참고
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V부팅 시 1.6-3.3V - TX
    3INFOhm (멀티미터 1)INFOhm (멀티미터 1)3.3V부팅 시 0V - RX
    40Ohm30kOhm0VGND
    PINGND 저항VCC 저항V참고
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • 예시

      PINGND 저항VCC 저항V참고
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (멀티미터 1)INFOhm (멀티미터 1)2.1V고임피던스, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (멀티미터 1)INFOhm (멀티미터 1)0V연결 안 됨?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (멀티미터 1)INFOhm (멀티미터 1)0V연결 안 됨?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • 호환되는 JTAG 테스트 사이트 핀아웃 발견: Altera Byteblaster
  • 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으로 선택
  • libssh2
  • openssl
  • JSON/XML
    • expat
    • json-c
  • UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save
  • uClibc 구성을 외부 트리에 저장하려면: make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig