1. 개요
하드웨어 장비의 펌웨어 파일을 별도로 확보하기 어렵다면 어떻게 해야 할까? 기판 위 SPI Flash 메모리에 직접 연결하면 부트로더부터 커널, 파일 시스템, 설정 데이터까지 담긴 원본 이미지를 읽어 낼 수 있다.
이번 글에서는 SPI Flash에 직접 접근해 하드웨어 장비의 펌웨어를 추출하고, 두 번 읽은 결과를 비교해 덤프의 무결성을 검증한다.
실습 시 사용한 장비: CH341A USB 프로그래머, SOIC8 클립, SOP16/8 → DIP8 어댑터, 멀티미터
실습 환경: Windows, WSL 2, usbipd-win, flashrom
[!CAUTION] 이 작업은 기판과 프로그래머를 손상시킬 위험이 있다. 반드시 대상 장비의 외부 전원과 모든 케이블을 분리하고, 대상 칩의 데이터시트와 프로그래머의 실제 출력 전압을 확인한 뒤 진행하자. 이 글은 읽기 전용 덤프만 다룬다.
진행 순서
- 기판에서 SPI Flash와 1번 핀을 찾는다.
- 대상 칩의 동작 전압과 CH341A의 출력 전압을 확인한다.
- SOIC8 클립 → 어댑터 → CH341A 순서로 연결한다.
- CH341A를 WSL 2에 연결하고
flashrom으로 칩을 탐지한다. - 메모리를 두 번 읽어 파일 크기와 SHA-256 해시를 비교한다.
[!TIP] 이 실습의 성공 기준은 단순히
.bin파일이 생성되는 것이 아니다. 파일은 연결이 불안정하거나 일부 영역만 읽힌 경우에도 만들어질 수 있기 때문에 다음 네 가지를 함께 확인해야 한다.
- 칩 정상 탐지:
flashrom이 제조사와 칩 정보를 올바르게 읽었다는 뜻이다. 칩을 탐지하지 못한 상태에서 얻은 데이터는 잘못된 연결이나 통신 오류로 생성되었을 가능성이 있다.- 예상 파일 크기 확인: 64 Mbit 메모리의 전체 크기는 8,388,608 bytes다. 이보다 작다면 읽기가 중간에 끝났거나 전체 주소 영역이 저장되지 않았을 수 있다.
- 두 덤프의 SHA-256 해시 일치: 같은 메모리를 두 번 읽은 결과가 바이트 단위로 동일하다는 뜻이다. 해시가 다르면 클립 접촉, 전압 또는 주변 회로의 간섭으로 읽기 결과가 달라졌을 가능성이 있다.
- 내용의 기본 형태 확인: 파일 전체가
FF또는00처럼 한 값으로만 채워지지 않았는지 확인한다. 잘못 연결된 상태에서 동일한 빈 데이터를 두 번 읽으면 파일 크기와 해시가 모두 일치할 수도 있다.네 조건을 모두 만족해야 분석에 사용할 수 있는 최소한의 신뢰성을 확보했다고 판단할 수 있다. 다만 해시 일치는 두 파일이 같다는 의미일 뿐, 그 안의 데이터가 완전한 펌웨어 구조인지까지 보장하지는 않는다. 내부 구조는 이후 분석 단계에서 별도로 확인해야 한다.
2. SPI Flash란?
SPI Flash는 SPI(Serial Peripheral Interface) 방식으로 데이터를 주고받는 비휘발성 메모리다. 전원이 꺼져도 데이터가 유지되기 때문에 임베디드 장비에서 부트로더, 운영체제 커널, 파일 시스템, 환경설정 등을 저장하는 용도로 사용된다.
이번 실습처럼 기판 위 SPI Flash에 직접 연결하면 장비가 정상적으로 부팅되지 않거나 제조사가 펌웨어 파일을 별도로 제공하지 않는 상황에서도 저장된 데이터를 읽을 수 있다. 다만 기판에 장착된 상태로 접근하는 인서킷 방식은 주변 회로의 영향을 받을 수 있으므로 전압과 연결 방향을 주의해야 한다.
실습 대상 메모리

기판에서 확인한 칩은 MD25Q64CSIG다. 모델명의 64는 저장 용량이 64 Mbit라는 뜻이며, 바이트로 환산하면 다음과 같다.
| |
| 항목 | 내용 |
|---|---|
| 종류 | 비휘발성 SPI NOR Flash |
| 인터페이스 | SPI / Dual SPI / Quad SPI |
| 용량 | 64 Mbit (8 MiB) |
| 공급 전압 | 2.7~3.6 V |
| 패키지 | SOP8 (208 mil) |
| 예상 데이터 | 부트로더, Linux 커널, 루트 파일 시스템, 환경설정 등 |
장비마다 Flash 파티션 구성은 다르다. 따라서 “부트로더·커널·파일 시스템이 들어 있을 것”이라는 설명은 일반적인 예시이며, 실제 구성은 덤프 후 binwalk, strings, 헥스 에디터 등으로 확인해야 한다.
[!NOTE] 칩 표면에는
MD25Q64CSIG라고 적혀 있지만, 이번 실습에서flashrom은 칩을GD25Q64(B)로 탐지했다.flashrom은 칩 표면의 문자열이 아니라 JEDEC ID를 읽어 지원 목록과 대조하며, MD25Q64C 데이터시트에도 GigaDevice 제조사 ID가 명시되어 있다. 따라서 본문에는 표면 표기와 자동 탐지 결과를 모두 기록했다. 두 모델의 명칭이 다르므로 쓰기나 지우기 작업을 하려면 명령 세트와 보호 기능의 호환성을 별도로 확인해야 한다.
[!IMPORTANT] 칩 표면의 글자는 조명과 각도에 따라
M,G,0,O등이 비슷하게 보인다. 확대 사진으로 모델명을 다시 읽고, 데이터시트의 전압·핀 배열과 대조하자.
3. 덤프 장비
| 장비 | 역할 | 확인할 점 |
|---|---|---|
| SOIC8 클립 | 기판에서 칩을 떼지 않고 8개 핀에 접촉 | 빨간 선이 1번 핀인지 확인 |
| SOP16/8 → DIP8 어댑터 | 클립 케이블을 CH341A ZIF 소켓에 연결 | 어댑터의 1번 핀 방향 확인 |
| CH341A USB 프로그래머 | PC와 SPI Flash 사이에서 데이터 전달 | SPI 모드와 3.3 V 출력 확인 |
| 멀티미터 | 공급 전압과 배선 확인 | VCC-GND 사이 전압 측정 |
| Windows + WSL 2 | usbipd-win과 flashrom 실행 | WSL 2 및 USB 연결 지원 여부 확인 |
SOIC8 클립

SOIC8 클립을 사용하면 칩을 기판에서 떼어 내거나 납땜하지 않고도 각 핀에 연결할 수 있다. 편리한 대신 접촉 불량이 생기기 쉬우므로, 덤프가 불안정하면 가장 먼저 클립 위치를 다시 확인해야 한다.
SOP16/8 → DIP8 어댑터

클립의 8핀 리본 케이블을 CH341A의 ZIF 소켓 규격에 맞춰 주는 변환 어댑터다. 어댑터에도 1번 핀 표시가 있으므로 빨간 선과 같은 방향인지 확인한다.
CH341A USB 프로그래머

CH341A는 USB와 SPI 사이를 연결하는 저가형 프로그래머다. flashrom에서는 ch341a_spi 프로그래머로 사용할 수 있다.
[!WARNING] CH341A 보드는 외형이 같아도 회로와 출력 전압이 다를 수 있다. 점퍼의
3.3 V표기만 믿지 말고, 대상 칩을 연결하기 전에 멀티미터로 VCC와 신호 핀 전압을 측정하자. MD25Q64CSIG의 공급 전압 범위는 2.7~3.6 V다.
4. SPI Flash 식별 및 장비 연결
연결 전 안전 확인
아래 항목을 모두 확인한 뒤 USB를 연결한다.
- 대상 장비의 외부 전원과 모든 케이블을 분리했다.
- 전원 버튼을 몇 차례 눌러 기판에 남은 전하를 방전했다.
- 칩 모델명과 데이터시트의 핀 배열을 확인했다.
- CH341A가 SPI 모드로 설정되어 있다.
- 프로그래머 출력이 대상 칩의 전압 범위와 맞는다.
- 칩, 클립, 어댑터의 1번 핀 방향이 모두 일치한다.
- 첫 작업에서는 쓰기(
-w)나 지우기(-E) 명령을 사용하지 않는다.
인서킷 방식은 Flash가 기판에 붙어 있는 상태에서 읽기 때문에 프로그래머가 메모리뿐 아니라 주변 회로에도 전원을 공급할 수 있다. 전압이 크게 떨어지거나 칩 탐지가 계속 실패하면 무리하게 반복하지 말자. 주변 회로가 SPI 버스를 점유하거나 전류를 많이 소비하는 경우에는 칩 분리 또는 전문 장비가 필요할 수 있다.
연결 순서
1단계. 기판에서 SPI Flash와 1번 핀 찾기

8핀 칩이라고 모두 SPI Flash인 것은 아니다. 칩 표면의 모델명을 검색해 데이터시트를 확인하고, 패키지의 점이나 홈으로 1번 핀을 찾는다.
일반적인 8핀 SPI NOR Flash의 핀 구성은 다음과 같지만, 실제 연결은 반드시 대상 칩의 데이터시트를 기준으로 한다.
| 핀 | 신호 | 역할 |
|---|---|---|
| 1 | CS# | 칩 선택 |
| 2 | SO / IO1 | 데이터 출력 |
| 3 | WP# / IO2 | 쓰기 보호 / 데이터 I/O |
| 4 | GND | 접지 |
| 5 | SI / IO0 | 데이터 입력 |
| 6 | SCLK | SPI 클록 |
| 7 | HOLD# / IO3 | 통신 일시 정지 / 데이터 I/O |
| 8 | VCC | 전원 |
2단계. SOIC8 클립 연결

클립의 빨간색 선을 칩의 1번 핀에 맞춘다. 클립이 비스듬하면 일부 핀이 닿지 않을 수 있으므로 위에서 보았을 때 칩과 평행한지 확인한다.
3단계. 클립과 어댑터 연결

리본 케이블의 빨간 선이 어댑터의 1번 핀 표시와 일치하도록 꽂는다. 제품마다 실크 인쇄 방향이 다를 수 있으므로 사진만 따라 하기보다 핀 번호를 직접 확인하는 편이 안전하다.
4단계. CH341A의 소켓 위치 확인

CH341A의 ZIF 소켓에서 25xx SPI Flash용 위치를 확인한다. 보드 버전마다 소켓 표기가 다를 수 있으므로 해당 제품의 핀맵도 함께 확인한다.
5단계. 어댑터를 CH341A에 고정

어댑터를 올바른 위치에 삽입하고 ZIF 레버를 내려 고정한다. 전체 방향을 한 번 더 확인한 뒤 마지막으로 CH341A를 PC의 USB 포트에 연결한다.
5. WSL 2에서 flashrom 사용하기
[!NOTE] Windows용 Programmer 사용 방법
일반적으로 CH341A는 Windows용 Programmer 프로그램을 이용해 다음 순서로 읽을 수 있다.
- CH341A 드라이버를 설치하고 Windows 장치 관리자에서 연결 상태를 확인한다.
- Programmer 프로그램을 실행한 뒤 메모리 종류를
25 SPI Flash로 설정한다.- 자동 탐지 기능을 사용하거나 칩 제조사와 정확한 모델명을 직접 선택한다.
Read버튼을 눌러 메모리 전체를 읽는다.- 읽기가 끝나면
Verify또는 비교 기능으로 결과를 확인한다.Save기능을 이용해 읽은 데이터를.bin파일로 저장한다.펌웨어 추출이 목적이라면 메모리 내용을 변경하는
Erase,Program,Write,Auto기능은 사용하지 않는다. 프로그램마다 메뉴의 이름과 위치는 다를 수 있다.이번 실습에서 WSL 2 + flashrom을 사용한 이유
Windows용 Programmer에서 칩 인식이 불안정해
flashrom으로 전환했다. WSL 2에서는 탐지 결과와 오류를 터미널에서 확인하기 쉽고, 같은 명령으로 반복 덤프한 뒤cmp나sha256sum으로 바로 검증할 수 있다. 다만 접촉 불량이나 전압 문제 같은 하드웨어 문제까지 해결되는 것은 아니다.
CH341A를 WSL 2에 연결하기
WSL 2는 USB 장치를 바로 사용할 수 없으므로 Windows 측의 usbipd-win으로 장치를 전달해야 한다. 아래 과정은 usbipd-win 5.0.0 이상을 기준으로 한다.
먼저 WSL 터미널을 하나 열어 둔 상태에서, 관리자 권한 PowerShell로 장치 목록을 확인한다.
| |
목록에서 CH341A의 BUSID를 찾은 다음 장치를 공유한다. <BUSID>는 실제 값(예: 4-4)으로 바꾼다.
| |
이제 장치를 WSL에 연결한다. 최신 버전에서는 이 단계에 관리자 권한이 필요하지 않다.
| |
WSL 터미널에서 장치가 보이는지 확인한다.
| |
작업이 끝나면 PowerShell에서 장치를 분리할 수 있다.
| |
usbipd bind는 최초 공유 시 관리자 권한이 필요하고,attach는 WSL이 실행 중인 상태에서 수행해야 한다. 명령 형식이 맞지 않으면 설치된usbipd-win버전을 먼저 확인하자.
6. flashrom으로 펌웨어 읽기
6-1. 도구 설치
Ubuntu 계열 WSL이라면 다음과 같이 설치한다.
| |
설치 후 버전을 기록해 두면 나중에 작업을 재현하기 쉽다.
| |
6-2. 칩 탐지
처음에는 읽기 명령을 바로 실행하지 말고 탐지만 수행한다.
| |
출력에서 다음 내용을 확인한다.
- CH341A 프로그래머가 열렸는가?
flashrom이 지원하는 칩 이름과 용량이 표시되는가?- 감지된 용량이 8 MiB인가?
- 여러 칩이 동시에 후보로 표시되거나 오류가 발생하지 않았는가?
flashrom이 하나의 지원 칩과 예상 용량을 명확히 표시한 경우에만 다음 단계로 넘어간다. 표면 표기와 탐지명이 다르면 JEDEC ID와 양쪽 데이터시트를 대조해 차이를 기록한다. 여러 후보가 표시되면 출력에 나온 모델들을 칩 표면의 표기와 비교한 뒤 -c <chipname> 옵션을 검토한다. 원인을 확인하지 않은 채 -f로 강제 진행하는 것은 피하자.
6-3. 두 번 덤프

같은 상태에서 파일명을 달리해 두 번 읽는다.
| |
정상적으로 완료되면 flashrom 출력에 읽기 성공 메시지가 표시된다. 하지만 성공 메시지만으로 덤프의 신뢰성을 단정할 수는 없다. 다음 단계에서 파일 크기와 내용을 비교한다.
7. 덤프 무결성 검증
파일 크기 확인
64 Mbit 칩을 전체 덤프했다면 각 파일은 8,388,608 bytes여야 한다.
| |
두 파일 비교
| |
cmp가 아무것도 출력하지 않고 두 SHA-256 값이 같다면 두 덤프가 바이트 단위로 동일하다는 뜻이다. 해시가 다르면 분석을 진행하지 말고 클립 접촉, 핀 방향, 전압, 주변 회로의 간섭을 다시 확인한 뒤 재덤프한다.
내용 기본 확인
덤프 앞부분을 16진수로 확인해 데이터가 실제로 들어 있는지 살펴본다.
| |
출력 전체가 ff 또는 00으로만 보인다면 다른 오프셋과 binwalk 결과도 확인한다. 메모리 일부가 비어 있는 것은 정상일 수 있지만, 파일 전체가 하나의 값으로만 채워져 있다면 정상적인 펌웨어 덤프로 보기 어렵다.
[!TIP] 검증을 마친 원본 덤프는 수정하지 말고 읽기 전용으로 보관하자. 분석용 복사본을 따로 만들고, 파일명에 작업 날짜와 해시 일부를 포함하면 여러 덤프를 관리하기 쉽다. 덤프에는 계정 정보, 장비 설정, 고유 식별자, 인증서 같은 민감 정보가 포함될 수 있으므로 공개 저장소에 그대로 올리면 안 된다.
8. 문제가 생겼을 때 확인할 것
| 증상 | 가능한 원인 | 확인 방법 |
|---|---|---|
lsusb에 CH341A가 보이지 않음 | WSL 연결 누락, Windows 드라이버/USB 문제 | usbipd list, attach 상태, 다른 USB 포트 확인 |
Couldn't open device 또는 권한 오류 | 장치를 Windows가 사용 중이거나 권한 부족 | WSL 재연결, sudo 사용 여부 확인 |
No EEPROM/flash device found | 클립 접촉 불량, 핀 방향 오류, 전압 문제 | USB를 뽑고 1번 핀과 모든 접점 재확인 |
| 칩 후보가 여러 개 표시됨 | JEDEC ID가 같은 호환 칩 존재 | 칩 표면과 후보 데이터시트를 대조하고 -c 검토 |
| 덤프할 때마다 해시가 달라짐 | 접촉 불량, 전원 불안정, 기판 내 다른 회로의 버스 간섭 | 클립 재장착, 전압 측정, 짧은 배선 사용 |
파일 대부분이 FF 또는 00 | 잘못된 연결 또는 읽기 실패 가능성 | 재덤프 후 해시 비교, 헥스 덤프와 binwalk로 확인 |
인서킷 덤프가 계속 실패하는데 배선과 전압이 정상이라면, 기판의 SoC나 다른 부품이 SPI 신호를 끌어당기고 있을 가능성이 있다. 이때는 무리하게 전압을 올리지 말고 칩을 기판에서 분리해 읽는 방식을 고려해야 한다.
9. 덤프 이후에는 무엇을 확인할 수 있을까?
검증된 덤프 파일은 펌웨어 분석의 출발점이다. 우선 binwalk로 파일 안에 알려진 시그니처가 있는지 확인할 수 있다.
| |
분석 결과에서는 다음과 같은 질문의 답을 찾아볼 수 있다.
- 부트로더와 커널은 어느 위치에 저장되어 있는가?
- 어떤 압축 형식과 파일 시스템을 사용하는가?
- 부팅 과정에서 어떤 스크립트와 설정 파일을 읽는가?
- 실행 파일의 CPU 아키텍처와 사용 라이브러리는 무엇인가?
- 장비별 설정이나 고유 데이터는 어느 영역에 저장되는가?
binwalk의 탐지 결과가 항상 정확한 것은 아니므로 각 오프셋의 실제 데이터와 파일 헤더를 추가로 확인해야 한다. 또한 분석은 원본이 아닌 복사본에서 진행하고, 발견한 계정 정보·인증서·고유 식별자 등은 외부에 공개하지 않는다.
마무리
SPI Flash 덤프에서 가장 중요한 것은 명령어 자체보다 전압, 방향, 반복 검증이다. flashrom -r 한 번이 성공했다고 바로 분석을 시작하기보다, 같은 메모리를 두 번 읽고 크기와 해시가 모두 일치하는지 확인해야 신뢰할 수 있는 원본을 얻을 수 있다.
검증된 원본을 안전하게 보관했다면 그다음부터는 복사본을 이용해 파티션 구조, 파일 시스템, 설정 파일과 실행 파일을 차례로 분석하면 된다. 결국 안정적인 덤프를 확보하는 과정은 펌웨어 분석의 끝이 아니라, 신뢰할 수 있는 출발점을 만드는 작업이다.

