IoT(사물인터넷) 공격을 효과적으로 수행하기 위해서는 먼저 하드웨어 분석이 필수적입니다. 하드웨어 분석 후에는 펌웨어를 추출하고 분석하는 과정이 이어집니다. 이 단계에서는 펌웨어 내의 코드와 설정을 면밀히 살펴보아야 하며, 이를 통해 잠재적인 취약점을 발견할 수 있습니다. 다음으로, 임베디드 시스템에서 사용되는 PCB(인쇄회로기판) 기판 구조를 이해하는 것도 중요합니다. PCB 구조는 기기의 기능과 신뢰성에 직접적인 영향을 미치기 때문에, 이를 분석하는 과정에서 발견되는 문제점이나 약점은 IoT 기기의 보안성을 높이는 데 큰 도움이 됩니다.
1️⃣ PCB (Printed Circuit Board, 인쇄 회로 기판)

PCB는 전자 장치에서 회로를 지원하기 위해 사용되는 기판입니다. 임베디드 시스템의 PCB는 전기적 및 기계적 구성 요소를 지원하며, 시스템의 전체적인 동작에 중요한 영향을 미칩니다.
우선, IC (Integrated Circuit, 집적 회로)를 식별을 해야 합니다. 그리고 공개된 DataSheet가 있으면 제품에 대한 일반적인 설명, 핀 레이아웃 및 핀의 기능 정보, 간단한 기능 설명 등의 정보를 수집합니다.
PCB는 다양한 요소로 구성되어 있으며, 각 구성 요소는 시스템의 특정 기능을 담당합니다. 주요 구성 요소에는 CPU, SPI, JTAG 등이 있습니다.
2️⃣ CPU (Central Processing Unit)
CPU는 PCB의 핵심 구성 요소로, 마치 두뇌와 같은 역할을 합니다. 모든 계산과 데이터 처리, 그리고 명령 실행은 이 CPU에서 이루어집니다.
일반적으로 CPU는 다수의 핀을 갖추고 있으며, PCB 상에서 중앙에 위치하는 경우가 많습니다. 이러한 중앙 위치는 데이터 전송과 연결의 효율성을 높여줍니다. 또한, CPU는 고온에서 작동하기 때문에 방열판이나 냉각 팬이 장착되어 있는 경우가 많습니다. 이러한 냉각 장치는 CPU의 성능을 유지하고 과열을 방지하는 데 필수적입니다.
2.1. UART (Universal Asynchronous Receiver Transmitter)
UART는 비동기식 통신에 사용되는 제어기로, Clock X, Baud Rate를 사용합니다. Baud Rate는 시리얼 라인으로 전송되는 데이터 속도로, UART 연결 시 Baud Rate를 맞춰줘야 통신을 원활하게 할 수 있습니다.

MCU/SoC의 DataSheet를 구할 수 있는 경우 핀 Map을 통해 UART를 확인합니다.
UART는 총 4개의 핀을 사용하며, 각 핀의 용도는 다음과 같습니다.
TX : 데이터 송신
RX : 데이터 수신
GND : 그라운드
VCC : 전압
2.1.1. VCC
VCC는 "Voltage at the Common Collector"의 약자로, 포지티브 전원 공급 라인을 의미합니다. 전통적으로 트랜지스터 회로에서 사용된 용어인 VCC는 현재 다양한 디지털 회로에서 긍정적인 전원 공급을 가리키는 데 사용됩니다. VCC는 회로나 장치에 필요한 전력을 공급하는 주요 선으로, 일반적으로 마이크로컨트롤러, 센서, 그리고 다른 전자 부품들이 작동하기 위해 필요한 전압을 제공합니다.
VCC가 없는 경우도 있으며, 있을 경우에도 UART 연결 시에는 사용하지 않습니다. RX, TX 핀이 아닌 것을 찾아내려는 것이 주 목적입니다. 스퀘어 홀인 경우나 1번 핀이 VCC를 가리키는 경우가 많습니다.
2.1.2. GND
GND는 "Ground"의 약자로, 회로의 지점 중 하나를 참조 전압 점으로 설정하는 것을 의미합니다. 일반적으로 이 참조 점은 전기적으로 중립적인 접지를 의미하며, 회로의 모든 전류가 최종적으로 흘러가는 지점입니다. GND는 안정적인 작동을 위한 전압의 기준점을 제공하며, 전자 장치 간의 전압 불일치를 방지하고, 과도한 전류가 발생했을 때 안전한 경로를 제공합니다.
2.1.3. TX/RX
TX와 RX는 각각 "Transmit"과 "Receive"의 약자로, 데이터 통신에서 사용되는 용어입니다. TX는 데이터를 전송하는 라인을, RX는 데이터를 수신하는 라인을 의미합니다. TX/RX를 판별하기 위해서는 여러가지 방법이 있습니다.

멀티미터를 이용하여 전압 측정 시, TX 핀의 경우 전압이 활발해지고, RX의 경우 하이볼트(IDLE 상태)를 유지합니다.

로직 분석기를 이용하여 디지털 신호를 캡처 후 시그널 분석하여 TX/RX를 식별하는 방법도 있습니다.
2.1.4. Baud Rate 측정 (로직 분석기)
Buad Rate란 초당 보내는 비트 수(bps)를 의미합니다. 보통 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 값 중 하나를 가집니다.

A1과 A2 사이의 Time Delta 값이 18.33 마이크로 초입니다. 따라서 1초당 신호 단위 수는 1000000/18.33 = 54555.37이므로, Baud Rate는 57600쯤 됩니다.

USB to UART 어댑터를 통해 UART 연결하면 됩니다. TX는 데이터를 보내는 라인이며, RX는 데이터를 받는 라인이므로, UART 통신을 위해서는 한 장치의 TX 라인을 어댑터 RX 라인에 연결해야 하며, 반대로 한 장치의 RX 라인을 어댑터 TX 라인에 연결해야 합니다.

Port 확인 시 COM6으로 확인됩니다.

시리얼 통신 에뮬레이터 설정에서 해당 Port와 Baud Rate를 맞춰준 뒤 연결하면 부팅 메시지 및 디버그 메시지를 확인할 수 있습니다.
2.2. 부트 로더 (Boot Loader)
부트 로더는 시스템이 부팅될 때 시스템의 하드웨어를 초기화하고 운영체제의 커널을 메모리에 올려 실행시키는 시스템 프로그램입니다. 주로 /etc/init.d/rcS 파일입니다.
일반적으로 시스템 메모리의 물리 주소 0번지부터 위치하고, ROM, Flash, SRAM 등 정적인 메모리에 위치합니다.
만약 바로 Shell 획득이 되지 않았다면, 부팅 시 출력되는 데이터를 획득하여 펌웨어로 리패키징 합니다. 그리고 부팅 시 사용되는 변수를 /bin/bash로 설정하여 부팅 시 bash가 실행되도록 하면 Shell 획득이 됩니다.
Shell을 사용하면 파일 시스템에 직접 접근하여 파일을 삽입하거나 추출할 수 있습니다. 이를 통해 시스템에 새로운 프로그램을 설치하거나, 기존 프로그램을 수정하거나, 시스템 로그와 같은 중요한 정보를 추출할 수 있습니다.
UART를 통한 접근은 임베디드 시스템이나 IoT 기기 등에서 진단, 디버깅, 리버스 엔지니어링 등의 목적으로 자주 사용됩니다. 이 방법은 기기에 물리적으로 접근할 수 있을 때 매우 유용하며, 보안을 강화하고, 시스템의 이해도를 높이며, 펌웨어 관련 작업을 효율적으로 수행할 수 있는 방법을 제공합니다.
3️⃣ SPI (Serial Peripheral Interface)
SPI는 마이크로컨트롤러와 주변장치 사이의 통신을 위한 시리얼 통신 프로토콜입니다. 그 중심에는 마스터/슬레이브 구조가 있으며, 마스터는 통신을 제어하고 하나 이상의 슬레이브와 데이터를 교환할 수 있습니다.
3.1. 8핀 SPI 통신
8핀 SPI 인터페이스는 다음과 같은 핀 구성을 가지고 있습니다.
VCC: 전원 공급선으로, 주변장치에 전력을 공급합니다.
GND: 접지선으로, 공통의 전기적 접지를 제공합니다.
MOSI (Master Out Slave In): 마스터 장치에서 슬레이브 장치로 데이터를 전송합니다.
MISO (Master In Slave Out): 슬레이브 장치에서 마스터 장치로 데이터를 전송합니다.
SCK (Serial Clock): 클록 신호를 제공하여 데이터 전송의 타이밍을 조절합니다.
SS (Slave Select): 슬레이브 장치를 활성화하거나 비활성화하기 위한 신호입니다.
추가적으로 IRQ (Interrupt Request) 및 기타 제어선을 포함할 수 있습니다.
이러한 핀 구성을 통해 SPI는 데이터 전송에 있어 높은 속도와 안정성을 제공하며, 단순함이라는 장점을 지니고 있습니다.
3.2. 48핀 SPI 통신
48핀 인터페이스를 포함하는 SPI 장치는 훨씬 더 많은 기능을 가지고 있으며, 복잡한 통신을 필요로 하는 고급 장치에서 사용됩니다. 48핀은 다수의 SS 핀을 포함할 수 있고, 더 많은 데이터와 제어선으로 더 복잡한 통신 프로토콜을 지원합니다. 이는 대용량의 데이터 저장이 필요한 메모리 칩이나, 고속 통신이 필요한 고급 센서에서 주로 볼 수 있습니다.
3.3. Firmware 추출
펌웨어 추출은 주로 역공학, 보안 분석 또는 펌웨어 업데이트 시에 수행됩니다. SPI 통신을 통해, 플래시 메모리와 같은 저장 장치로부터 직접 펌웨어를 읽어낼 수 있습니다. 이 과정은 SPI 칩 추출 후 전용 SPI 리더나 프로그래머(T48 Programmer, T56 Programmer 등)를 사용하여 진행되며, 메모리 칩에서 데이터를 순차적으로 또는 무작위로 액세스하여 전체 펌웨어 이미지를 추출합니다.