4️⃣ JTAG (Joint Test Action Group)

JTAG 인터페이스는 하드웨어 디버깅, 프로그래밍, 그리고 테스트를 위해 널리 사용되는 표준입니다. 본질적으로, JTAG는 칩셋이나 보드 레벨에서의 직접적인 메모리 접근을 가능하게 함으로써, 개발자와 엔지니어가 시스템의 깊은 부분까지 접근할 수 있도록 해줍니다.
또한, JTAG 인터페이스는 복잡한 전자 시스템 내부의 진단과 테스트를 용이하게 합니다. 이는 하드웨어 버그의 진단, 펌웨어 및 소프트웨어 디버깅, 시스템 초기화 및 구성, 그리고 비휘발성 메모리에 프로그램을 로드하는 기능을 포함합니다. JTAG를 통해, 개발자는 시스템의 동작을 멈추고, 메모리를 읽고 쓰며, 프로세서 레지스터를 검사할 수 있습니다.
4.1. TAP (Test Access Port)
JTAG 인터페이스는 통상적으로 최소 4개의 핀으로 구성됩니다: TDI (Test Data In), TDO (Test Data Out), TCK (Test Clock), 그리고 TMS (Test Mode Select). 때때로, TRST (Test Reset) 핀이 추가되기도 합니다. 이 핀들은 JTAG 지원 장치에 연결되어 테스트 및 프로그래밍 명령을 전송하는데 사용됩니다.
TDI (Test Data In): 테스트 명령어나 데이터를 장치로 전송합니다.
TDO (Test Data Out): 장치로부터의 응답이나 데이터를 전송합니다.
TCK (Test Clock): JTAG 명령어의 타이밍을 동기화합니다.
TMS (Test Mode Select): 장치의 다양한 테스트 모드 사이를 전환합니다.
TRST (Test Reset): 선택적으로 제공되며, JTAG 인터페이스를 리셋합니다.
4.2. JTAG를 통한 펌웨어 추출
JTAG 인터페이스를 통해 장치의 메모리에서 직접 펌웨어 이미지를 읽어내어 펌웨어 추출이 가능합니다. 이를 통해, 장치의 취약점을 식별하고, 역공학을 통해 시스템의 동작 방식을 이해할 수 있습니다. 또한, JTAG를 사용하여 수정된 펌웨어를 장치에 다시 로드함으로써, 기능을 개선하거나 새로운 기능을 추가하는 등 펌웨어 변조가 가능합니다.
JTAG 인터페이스는 강력한 도구이지만, 동시에 보안 위험도 내포하고 있습니다. 장치의 JTAG 포트가 무단으로 접근 가능한 경우, 악의적인 사용자가 시스템을 조작하거나 민감한 정보를 추출할 수 있습니다. 따라서, 제품 출시 전에 JTAG 접근을 비활성화하거나 보호하는 것이 중요합니다.
5️⃣ Firmware 획득
장비 분석을 위해 Firmware를 구해야 하는데, Firmware 획득하는 방법은 다양합니다.
제조사 홈페이지 등 제공되는 Firmware를 다운로드 할 수 있습니다. 타겟 디바이스의 종류나 버전에 따라 Firmware가 제공되지 않을 수도 있습니다.
Firmware 자동 업데이트 기능이 있을 경우, 평문이라면 ARP Spoofing을 통해 Firmware를 가로챌 수 있고, SSL을 통해 통신한다면 중간에서 포트 포워딩을 통해 획득이 가능합니다. SSL Pinning이 적용되어 있을 경우 우회를 통한 포트 포워딩을 진행해야 합니다.
위에서 설명한 것처럼 UART, JTAG 등을 통해 펌웨어 추출도 가능합니다. 추출한 펌웨어를 언패킹 하는 방식은 다음과 같습니다.
5.1. Firmware 언패킹
이렇게 획득한 펌웨어는 언패킹을 통해 부트로더, 커널 이미지, 파일 시스템을 분리해야 합니다. binwalk, firmware-mod-kit 등의 Tool을 통해 언패킹 할 수 있습니다.

file 명령어로 Firmware 파일 확인

hexdump로 덤프 → grep 명령어로 시그니처 헤더 확인

파일 시스템 시그니처 헤더 바이트로 분리

분리 된 파일시스템 mount
binwalk로 한번에 추출하는 방법도 있습니다.

-e 옵션을 주면 추출이 됩니다.

CramFS 파일 시스템을 조회할 수 있습니다.
5.2. Firmware 가상화
추출된 펌웨어는 가상 환경에서 분석될 수 있습니다. 펌웨어 가상화는 실제 하드웨어의 필요 없이 펌웨어를 실행시켜 분석하는 기술로, 보안 취약점을 찾거나 새로운 기능을 테스트하는 데 유용합니다. 가상화된 환경에서 펌웨어를 실행함으로써, 개발자와 분석가는 안전한 환경에서 시스템의 동작을 모니터링하고 검증할 수 있습니다.
이를 위해 QEMU (Quick Emulator)와 같은 가상화 도구가 매우 유용하게 사용됩니다. QEMU를 활용한 펌웨어 가상화는 실제 장치 없이도 펌웨어를 실행하고 테스트할 수 있는 방법을 제공합니다.
5.2.1. QEMU란 무엇인가?
QEMU는 다양한 플랫폼을 위한 오픈 소스 가상화 및 에뮬레이터 소프트웨어입니다. 이를 통해 개발자는 리눅스, 윈도우, 맥OS뿐만 아니라 ARM, x86, MIPS 등과 같은 다양한 아키텍처를 에뮬레이트할 수 있습니다. 펌웨어 개발 시 QEMU를 사용하면 개발 초기 단계에서부터 펌웨어를 실행하고, 디버깅하며, 다양한 시나리오에서 테스트를 진행할 수 있습니다.
5.2.2. QEMU를 사용한 펌웨어 가상화 과정
펌웨어 획득·추출
QEMU에서 펌웨어를 실행하기 전에, 먼저 장치에서 펌웨어를 추출하거나 공식 페이지에서 획득해야 합니다. SPI 통신과 같은 방법을 사용하여 메모리 칩에서 직접 펌웨어를 읽어낼 수 있습니다.
가상 환경 설정
QEMU를 설정하는 것은 특정 아키텍처와 시스템에 맞는 에뮬레이션 환경을 구성하는 것을 의미합니다. 이는 커맨드 라인 옵션을 통해 메모리 사이즈, CPU 타입, 네트워크 설정 등을 정의하는 것을 포함합니다.
펌웨어 로드
QEMU에 펌웨어 이미지를 로드하고, 필요한 경우 추가 파일 시스템이나 커널 이미지와 함께 가상화된 환경을 실행합니다.
디버깅 및 테스트
QEMU는 GDB (GNU Debugger)와 통합될 수 있으며, 이를 통해 펌웨어를 단계별로 실행하고, 변수를 검사하며, 문제를 식별할 수 있습니다.
성능 분석 및 최적화
가상 환경에서 펌웨어를 실행하면, 시스템의 성능을 모니터링하고 필요한 경우 최적화할 수 있습니다.
5.2.3. QEMU 구동 방법 예시
필요한 가상 이미지 선택

32bit와 64bit 중 선택해서 kernel 이미지와 hda를 설치합니다.
ex) 32bit mipsel 설치를 원하면
vmlinux-3.2.0-4-4kc-malta와debian_wheezy_mipsel_standard.qcow2를 설치
설치한 파일에 맞는 명령어를 입력해서 가상 환경 실행 (root / root)
아래 명령어를 통해 qemu를 실행합니다.
qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"root/root로 로그인Firmware에서 추출(fmk, binwalk 등)한 파일 시스템 전송 (Local → QEMU)
# local에서 virtual로 scp -r squashfs-root root@192.168.5.12:/root/
파일 시스템을 가상 환경에 마운트 및 웹 서버 실행
# virtual에서 mkdir squashfs-root/var/run touch squashfs-root/var/run/lighttpd.pid mount -o bind /dev ./squashfs-root/dev mount -t proc /proc ./squashfs-root/proc mount -o bind /sys ./squashfs-root/sys chroot ./squashfs-root/ /bin/sh # chroot된 후 부팅 lighttpd -f /lighttp/lighttpd.conf -m /lighttp/lib/
5.2.4. Squeeze와 Wheezy의 차이
"Squeeze"와 "Wheezy"는 데비안(Debian) 리눅스 배포판의 릴리즈 코드네임입니다. 데비안은 안정성과 자유 소프트웨어에 초점을 맞춘 인기 있는 리눅스 배포판 중 하나로, 그 이름은 프로젝트의 초기 개발자인 이안 머독(Ian Murdock)과 그의 아내 데브라(Debra)의 이름을 결합하여 만들어졌습니다. 각각의 릴리즈는 특정한 개발 단계와 업데이트된 소프트웨어 패키지, 보안 패치, 시스템 개선사항을 포함합니다.
Squeeze (Debian 6.0)
Squeeze는 데비안의 6번째 안정 릴리즈로, 2011년에 출시
이 버전은 데비안에서 오래 지속된 안정적인 서비스를 제공하며, 많은 서버와 데스크탑에서 사용
당시의 주요 기능 중 하나는 데비안 인스톨러의 개선이었으며, 더 나은 하드웨어 지원과 자동화된 설치 옵션 제공
Wheezy (Debian 7.0)
Wheezy는 Squeeze의 후속으로, 데비안의 7번째 안정 릴리즈로 2013년에 출시
Wheezy는 멀티아키텍처 지원을 도입했으며, 이는 사용자가 하나의 시스템에서 여러 아키텍처의 패키지를 동시에 관리 가능
시스템 부팅 시간을 줄이는 systemd의 옵션을 처음으로 도입했으며, 더 많은 소프트웨어와 업데이트된 프로그램 패키지를 포함
차이점

데비안의 각 릴리즈는 일반적으로 전 릴리즈의 기반이 되며, 보안 업데이트와 버그 수정, 소프트웨어 패키지의 개선 등이 주요 변경점이 됩니다. 개발자와 사용자들은 더 안정적이고 기능이 향상된 시스템을 위해 새로운 릴리즈로 업그레이드하는 것을 고려합니다.