대표님 거실에도 있는 그 기기.
우리는 그걸 직접 사서 PCB부터 봤다.
들어가며
IoT 보안 진단을 시작할 때, "어디서부터 어떻게 손을 대야 할까?"라는 막막함이 가장 먼저 찾아옵니다. 우리는 복잡한 이론 대신, 실무에서 마주치는 현실적인 질문들을 던지며 펌웨어 추출에 필요한 전기·전자 필수 지식을 자연스럽게 풀어가고자 합니다.
보안 분석을 위해 꼭 제품을 뜯어야 할까?
PCB 기판에 있는 수많은 부품을 전부 알아야 할까?
SPI, JTAG, UART는 직렬 통신이라는데, 이것이 왜 중요한가?
하드웨어 해킹을 위한 전기 지식은 어디까지 필요할까?
이러한 궁금증을 차근차근 해결하기 위해, 우리는 펌웨어 추출 과정을 아래와 같이 3단계 난이도로 정의했습니다.
(추후 JTAG, I2C, 글리칭 등 심화 주제가 추가될 예정입니다.)
난이도 | 펌웨어 추출 방법 | 필요한 도구 / 소스 | |
|---|---|---|---|
1단계 (공개 펌웨어) | ★☆☆☆ | 공개 펌웨어 + binwalk | 제조사 홈페이지에서 .bin(바이너리) 파일 다운로드 |
2단계 (UART) | ★★☆☆ | UART > U-Boot 콘솔 | CH340 (UART 연결을 돕는 도구) |
3단계 (SPI Flash Dump) | ★★★☆ | 물리적으로 Flash 칩 직접 덤프 | CH341A + SOIC8 클립 (Flash 메모리 읽기/쓰기 도구) |
왜 1단계가 아닌 2단계(UART)부터 시작할까?
실제 취약점 진단 프로세스에서는 제조사 홈페이지에서 공개 펌웨어를 다운로드받아 binwalk로 분석하는 '1단계'를 가장 먼저 시도합니다.
하지만 본 글에서는 2단계(UART)부터 이야기를 시작합니다.
우리가 IoT 진단을 할 때 왜 하드웨어 구조를 이해해야 하는지 본질적인 개념을 잡기 위함입니다. 하드웨어와 소프트웨어가 맞닿는 접점인 UART를 먼저 이해하고 나면, 추후 공개 펌웨어를 손에 넣었을 때 분석 시야가 완전히 달라지기 때문입니다.
보통 펌웨어가 있는 경우 정적 분석을 통해서 진행하는 것이 수월하지만 좀 더 독자들의 이해를 돕기 위해 위와 같이 진행합니다.
(진단 프로젝트에 들어가면 다운로드 받을 1단계 펌웨어 파일 자체가 존재하지 않는 상황을 가장 먼저 맞닥뜨리게 됩니다. 결국 물리적으로 장비를 뜯어 UART를 잡거나 flash 메모리를 추출(Chip-Off)해야만 펌웨어를 구경이라도 할 수 있습니다.)
2단계(UART)에서 펌웨어 추출을 위해 사용된 도구
분석에 앞서, 사용된 도구 리스트입니다.
(어떤 도구들을 구비했었는지 하단에 공유합니다.)
[하드웨어]
분류 | 도구명 | 핵심 용도 및 역할 |
|---|---|---|
분해 & 보드 작업 | 드라이버 | IoT 장비 케이스 분리 |
인두기 & 납흡입기 | Pin Header 납땜, 테스트 포인트 연결 및 잔여 납 제거 | |
인두기 탭 | 좁은 보드 내 미세 부품 납땜 및 에나멜 선 작업 용이 | |
정전기 방지 핀셋 | 좁은 보드 내 미세 부품 조작 및 점퍼선 세밀하게 연결 | |
플럭스(납땜보조제) | 납땜 할 때 도와주는 보조제(페이스트) | |
PCB 세척제 | 알콜 성분으로 납땜을 할때 산화막, 산소 차단막이 형성되어서 작업 후 잔여물 청소용 | |
신호측정 & Pin식별 | 디지털 멀티미터기 | 도통 테스트를 통한 GND 식별 및 전압&저항 측정을 통한 TX/RX 핀 탐색 |
|
| |
물리 연결 & 통신 | CH340 (3.3V/5V) | USB to TTL 변환기로 타겟 보드의 UART(TX/RX/GND)와 PC의 USB 포트 상호 연결 |
점퍼선 | 물리적으로 핀과 핀을 연결할 다른 방법이 없을 경우 신호선 연결용(외부 Bus선) | |
유연납/무연납 | 무연납은 인두기 성능이 420도 이상으로 구비해야하며, 친환경 유연납은 인두기 성능이 비교적 낮은 200도 이상으로 구비해야하며, 환경오염 |
[소프트웨어]
분류 | 도구명 | 핵심 용도 및 역할 |
|---|---|---|
시리얼 터미널 | PUTTY | UART 포트에 연결하여 부팅 로그 확인 및 Root 쉘 제어 |
펌웨어 추출 & 분석 | Binwalk | 펌웨어 바이너리 파일 내 파일시스템 및 압축 영역 자동 추출 |
역공학 | Ghidra / IDA Pro | 추출된 핵심 바이너리 디컴파일 및 정적 취약점 분석 |
분석 기기 정보
TARGET | ipTIME A2003NS-MU |
|---|---|
SoC | Realtek RTL8197F @ 1GHz - MIPS32, Big-Endian(BE) |
RAM | 128MB DDR |
FLASH ROM | 16 MB SPI NOR - W25Q128/SOIC-8/3.3V |
WIRELESS | 2.4G RTL8197F 내장 + 5G RTL8812 계열 |
UART | 3.3V TTL/헤더존재/Baud실측(Realtek 계열 38400/115200) |
JTAG | 미확인 |
BOOT LOADER | U-Boot |
OS | Linux/BusyBox/MIPS-BE |
FIRMWARE | .bin(제조사 배포) |
I/O | USB 2.0 x1 + WAN x1 + LAN x3 |
※ 본 진단에서는 기기의 일반적인 성능 사양보다는 IoT 취약점 분석 및 힐링/해킹 관점에 직결되는 핵심 스펙(SOC, Flash, RAM, UART Pin 등) 위주로 선별하여 작업을 진행합니다. 이번 편에서 다룰 내용으로는 위의 스펙에서 UART 부분만이 핵심으로 해당됩니다.
(본 내용은 분석가의 주관적인 시각이 포함되어 있으며, 분석 목적 및 관점에 따라 중요하게 다루는 요소가 달라질 수 있습니다.)
1. 분해 시작 - UART 핀을 찾는다
당신이 PC정비사로 일하고 있는 상황을 가정합니다.
"친구 PC가 고장이 났다. 고쳐야 한다."
친구의 컴퓨터가 고장이 났다고 가정한다면, 어떻게 하시겠습니까? 당연하게 컴퓨터에게 이상이 있는지 확인하게 됩니다.

["PC의 화면이 나오지 않은 상태로 점검"해야 하는 상황의 이해를 돕기 위한 연출 된 이미지]
친구 PC가 화면에 아무것도 안 뜨고 켜지지도 않는 상황입니다. 화면이 없는 상태에서 정비사가 하는 행동은, 지금 우리가 하려는 UART 방식과 똑같습니다. 물론 UART는 사용자의 고장 해결용으로 만든 것은 아닙니다.
개발 단계, 공장 양산 단계, 개발자를 위해 일부러 만들어져 있습니다.
최근 양산 제품에서는 UART가 물리적으로 제거되거나,
흔적만 남긴 채 기능이 비 활성화되어 출시되는 경우가 많습니다.그래서 원래 개발·공장용 통로로 쓰이던 것을, 만든 사람이 개발이 끝난 뒤에도 막지 않고 남겨두면 해커 입장에서는 핵심 진입점이 되는 것입니다.

[실제 WIFI 모델 PCB기판 앞면]
우리는 이 부품들이 어떻게 동작하는지 전부 알 필요는 없지만, 개발자가 남긴 흔적을 찾기 위해 UART에 사용되는 이름 없는 4개의 핀(VCC, GND, TX, RX)을 전기적 특징만으로 구별해야 했습니다. 이 칩이 무엇을 계산하느냐가 아니라, 측정을 어떻게 하느냐에 중점을 두었습니다. 글리칭 테스트를 진행할 때 좀 더 다뤄보기로 하고, 지금은 간단하게 UART 개념만 정리해 보았습니다.
UART 핀 전기적 지문 표
GND | 모든 리턴 전류가 되돌아 오는 통로로써, 전압은 0V이며, 모든 신호의 기준점이 됩니다. 제일 쉽게 확인 가능한 핀입니다. |
|---|---|
VCC | 기판에 전기를 공급하는 핀으로 UART에서는 사용이 되지 않습니다. 단지 UART의 4개의 핀을 식별하기 위해서 확인하는 핀입니다. |
TX | 기기가 부팅 로그를 "말하는" 출력 단자입니다. 기판에 전원이 공급되면 데이터를 전송하기 때문에 전압 값이 많이 흔들리는 핀입니다. |
RX | 기기가 명령을 "듣는" 입력 단자입니다. 위의 3개를 다 찾고 난 뒤에 확정하는 핀입니다. |
이 전기적 지문의 차이를 이해하려면 기본적으로 옴의 법칙을 알아둘 필요가 있습니다.
옴의 법칙은 기초 이론이므로, 자세한 설명은 아래 그림으로 대신하겠습니다.

[이해를 돕기 위해 AI로 생성된 이미지입니다]
UART 이해하기

[UART의 이해를 돕기 위해 파이프 배수관을 이용한 직접 편집된 이미지입니다]
1번은 보내는 쪽(TX) 2번은 받는 쪽(RX) 입니다.
분류 | 의미 | 설명 |
|---|---|---|
공통 배수관 / 하수도 | GND | 공통적으로 존재해야 하는 "0V 기준선"입니다. 수위의 절대적 기준점이 있어야 높고 낮음(1과 0)을 판별할 수 있습니다. |
물이 계속 나오는 상태 | 1(High) | 전압이 들어오는 상태입니다. 평소 통신 대기 중이거나 데이터 비트 |
물이 나오지 않는 상태 | 0(Low) | 전압이 0V인 상태입니다. 통신의 시작(Start Bit)을 알리거나 데이터 비트 |
물의 세기 | 전압 | 파이프 내에 가해지는 전기적 힘/높이 레벨입니다. |
펌프 쪽 밸브 | TX | 신호를 보내는 주체입니다. 밸브를 열고 잠가서 물의 흐름(1/0)을 만들어냅니다. |
수도꼭지 쪽 센서 | RX | 신호를 받는 주체입니다. 물이 흐르는지 안 흐르는지 감지하여 데이터를 복원합니다. |
타이머 | Baud Rate | 송수신 간에 약속된 속도(박자)입니다. "1초에 몇 번 밸브를 조절하고 감지할 것인가"를 동일하게 맞춰주는 타이머입니다. |
비유를 정확하게 이해하기보다는 각 요소가 어떤 역할을 하는지 간단히 알아보다 보니, 위와 같이 이해하게 되었습니다.
전압이 어떻게 0과 1이 되는지는 아래 그림으로 간단히 대신하겠습니다.

[HIGH=3.3V, LOW=0V]
이 비트열 8개 = 1바이트 = 문자 하나 (UART로 전송 시)
전압의 HIGH/LOW = 비트의 1/0 - 이게 디지털 신호의 전부
멀티미터기로 찾아보기
우리는 측정을 해야 하는 사람으로서, 파이프 안의 상태를 직접 눈으로 확인하게 해주는 눈금 측정기 역할의 멀티미터를 사용해, 아래와 같이 물이 정상적으로 잘 흐르는지 확인해야 합니다.
목표: 멀티미터로 전원 ON/OFF 시 UART 단자를 찾습니다.아래 3가지만 확인하여 UART를 특정할 수 있습니다.
공통 배수관이 연결되어 있는가? (GND점검)
밸브와 센서가 엇갈리지 않았는가? (TX/RX교차 연결 확인)
타이머 박자가 똑같은가? (Baud rate 설정 점검)
(본 내용은 분석가의 주관적인 시각이 포함되어 있으며, 분석 목적 및 관점에 따라 중요하게 다루는 요소가 달라질 수 있습니다.)

[멀티미터기 가장 우측으로 통전 테스트를 두고 진행]
우리는 전원을 입력하지 않고 멀티미터의 통전 테스트 기능으로 GND를 찾을 수 있습니다.
공통 배수관이라고 했던 것처럼, GND 핀은 기판 전체의 공통 접지(동판)와 연결되어 있기 때문입니다. 아무것도 연결되지 않은 기판 내 동판과, Pin 4개로 의심되는 지점을 번갈아 가며 체크하다 보면, 소리가 나는 지점이 서로 연결되어 있다는 뜻입니다. 통전 테스트는 전압이 아니라 전기적 연결 여부를 확인하는 기능이라, 전원을 가하지 않고도 GND를 찾을 수 있습니다.

[전원 공급 없이 GND를 찾은 사진]
이렇게 쉽게 1번을 끝냈습니다.
공통 배수관이 연결되어 있는가? (GND점검)밸브와 센서가 엇갈리지 않았는가? (TX/RX교차 연결 확인)
타이머 박자가 똑같은가? (Baud rate 설정 점검)
2번을 확인하려면 TX/RX/VCC를 찾아야 합니다. 이때는 전압값이 "0"이 아니므로 기기에 전원을 공급하여 확인합니다. 거의 모든 전자기기 PCB 기판은 직류 전압을 사용하므로, 직류 전압 모드로 변경합니다.
(물결 표시 ~ 는 교류를, 직선 표시 ⎓ 는 직류를 의미합니다.)

[전원 공급 후 GND - 0V]

[전원 공급 후 RX - 전압 값 3.3V로 안정적]

[전원 공급 후 TX - 전압 값 3.0~3.3V 왔다 갔다 하므로 불안정]

[전원 공급 후 VCC - 전압 값 3.3V +- 안정적]
위 사진들을 통해 아래에서부터 GND, RX, TX, VCC를 확인했습니다.
SPI Flash, JTAG 단자도 확인해 봐야 하지만, 이번 편에서는 UART만 다루므로 UART 단자만 확인합니다. UART 헤더는 흔히 VCC, TX, RX, GND 순으로 배치되는 경우가 많아, TX·RX·GND만 찾더라도 나머지 하나인 VCC의 위치를 추정할 수 있습니다.
2. 납땜 시작 - CH340을 PCB 기판과 연결한다
우리는 UART 단자들을 모두 식별하였습니다. 이제 간단하면서도 어려운 납땜을 시작하겠습니다.
목표: PCB기판의 UART단자(TX,RX,GND)와 USB-Serial 변환 칩인 CH340을 연결합니다.우리는 보통 컴퓨터의 중앙처리장치, 즉 뇌를 담당하는 것을 CPU라고 합니다. 그리고 주변 기기(메모리,SSD,HDD 등)를 통해데이터를 주고 받거나, 계산된 결과를 사람이 눈으로 볼 수 있게 출력,저장하는 부품들이 역할별로 나뉘어 있습니다.
하지만 지금 보고 있는 IoT 기기를 분해했을 때 나오는 PCB기판에서 중앙처리장치, 즉 뇌를 담당하는 것은 CPU 역할까지 포함하고 있는 SoC입니다.
납땜을 시작하기 전 SoC가 왜 중요한지 먼저 알아보겠습니다.
SoC (System On Chip)
시스템 온 칩이라고 부르며, 칩 하나에 시스템이 다 들어가 있습니다.
스마트폰이나 작은 기기처럼 공간이 부족하고 전기를 적게 써야 하는 PCB 기판에 주로 사용됩니다.

[이해를 돕기 위해 AI를 활용하여 생성된 이미지입니다.]
인터페이스는 성문이고, 핀은 실제로 사람이 드나드는 출입구입니다.
"성 → 도로 → 성문 → 출입구 → 외곽 도로" 로 이해하면 됩니다.
구성 요소 | 비유 | 설명 | 실제 구성 |
|---|---|---|---|
SoC | 성 | 작은 도시 전체를 통제하는 중심. | CPU, GPU, NPU, 메모리 컨트롤러 |
내부 버스 | 고속도로 | 칩 내부에서 데이터가 빠르게 이동하는 통로 | 데이터/주소/제어 버스 |
클럭 | 시계탑 | 모든 부품이 같은 타이밍으로 동작하도록 맞추는 기준 | 클럭 신호 |
외부 인터페이스 | 항구/공항 | 외부 기기와 연결되는 관문 | USB, HDMI, LAN 등 |
PCB 배선 | 도시 외곽 도로 | 칩과 다른 부품을 물리적으로 연결하는 길 | PCB 트레이스 |
UART | 좁은 골목길 | 단순한 1:1 직렬 통신 통로 | TX, RX |
(본 내용은 분석가의 주관적인 시각이 포함되어 있으며, 분석 목적 및 관점에 따라 중요하게 다루는 요소가 달라질 수 있습니다.)
그래서 우리는 성 내부 어디부터 외곽 도로와 연결되어있는지 찾기 위해, 아래와 같이 SoC의 스펙이 필요합니다.

[이해를 돕기 위해 AI를 활용하여 생성된 이미지입니다]
이처럼 SoC칩에서부터 분석이 시작되기 때문에, 진단 전에 SoC의 데이터시트를 확인해야 하는 것입니다.
(위의 이미지는 설명을 위해서 생성된 이미지로, 실제 데이터시트는 제조사 공식사이트에서 다운로드를 받아야합니다.)
CH340?
시중에서 파는 CH340 기반 USB-UART 어댑터는 대부분 이런 핀을 가지고 있습니다. 제품마다 조금씩 다르지만 핵심 4핀(VCC, GND, TX, RX)은 동일합니다.

[이해를 돕기 위해 생성된 이미지입니다]
기기 로직 전압 (보통3.3V)에 맞춰 어댑터의 전압 모드를 바꿔주면 되고, 사용 방법도 간단합니다. TX/RX를 기기 단자와 교차(TX↔RX)로 연결하되, 선은 암-수 점퍼선을 사용하면 됩니다.

[3.3V 단자 확인하기]

[UART 3.3V 모드로 바꾸는 이미지]
납땜
인두기와 플럭스, 납(무연납 또는 유연납), 점프선을 활용해서 납땜을 진행합니다.

[플럭스 사용 사진]

[납땜하는 사진]

[납땜 완료한 사진]
이렇게 또 쉽게 2번을 끝냈습니다.
공통 배수관이 연결되어 있는가? (GND점검)밸브와 센서가 엇갈리지 않았는가? (TX/RX교차 연결 확인)타이머 박자가 똑같은가? (Baud rate 설정 점검)
3. 직렬 통신 연결 시작 - CH340을 PC와 연결한다
납땜을 마쳐서 CH340과 PC를 연결할 준비가 끝났습니다. 이제 CH340을 PC의 USB에 연결합니다.

[CH340-PC USB로 연결한 뒤 장치관리자에서 COM번호 확인]
PuTTY를 열어서 Serial line(예: COM6) 번호에 맞추고, Speed 값에 Baudrate를 맞춥니다.

[PUTTY - Serial Line, Speed 설정]
문자(로그)가 출력되는 것을 확인합니다.

[UART 부트로그 확인]
※ 참고로 여러 Baudrate 값을 시도한 뒤 "38400"에서 부트로그가 확인된다는 것을 알아냈습니다.
위의 Baudrate 값은 무엇이고, 왜 맞춰야 하는지, 아래에서 간단히 설명하고 넘어가겠습니다.
Baudrate 값
9600
19200
38400
57600
115200
Baudrate 값을 맞추고 난 뒤, "A" 한 글자를 비트열로 분해해 보면 아래와 같이 이해할 수 있습니다.

[문자 'A'가 어떻게 생성되는지 이해를 돕기 위해 AI로 생성된 이미지입니다]
이렇게 또 쉽게 3번을 끝냈습니다.
공통 배수관이 연결되어 있는가? (GND점검)밸브와 센서가 엇갈리지 않았는가? (TX/RX교차 연결 확인)타이머 박자가 똑같은가? (Baud rate 설정 점검)
4. 결과
위의 부트로그를 확인 하였으나, 원문을 담고 있으므로 생략합니다.
UART 연결은 정상적으로 되었고, U-Boot부터 시작되는 전체 부팅 흐름을 부트로그로 확인하였으며, 이번 편에서 목표로 했던 UART 콘솔 로그 확인까지 마쳤습니다. 이제 마지막으로 남은 일은 쉘(shell)을 획득하는 것인데요. 일부 제조사들은 부팅 초기의 짧은 시간 안에 특정 키(바이트 시퀀스)를 정해진 타이밍에 입력해야만 부트로더(U-Boot) 셸이나 콘솔에 진입할 수 있도록 설계해두는 경우가 많습니다. 아래와 같이 이 기기가 바로 그 매직키(magic key) 설정이 되어 있어서, 콘솔 로그는 확인했지만 쉘 획득에는 실패한 케이스입니다. 파이썬 스크립트로 입력 타이밍을 자동화해서 시도해보았지만, 역시나 결과는 실패였습니다.
=================================================================
press magic key to change default setting ...그렇다면 이 기기의 펌웨어 추출은 포기해야 할까요?
"실제 취약점 진단 프로세스에서는 제조사 홈페이지에서 공개 펌웨어를 다운로드 받아 binwalk로 분석하는 '1단계'를 가장 먼저 시도한다."아직 방법이 남아 있습니다. 1단계, 제조사 홈페이지에서 공개 펌웨어를 다운로드 받아 binwalk로 분석하는 방법인데요. 해당 부분은 리버싱과 관련된 내용으로, 다음 편에서 계속됩니다.
