
펌웨어 리버스 엔지니어링 워크숍
이 저장소는 ScapyCon Automotive 2025에서 발표된 Emproof의 펌웨어 리버스 엔지니어링 워크숍을 위한 슬라이드와 실습 자료를 포함합니다. 이 워크숍은 보안 경험이 거의 없는 기술적 청중을 대상으로 하며, 실용적이고 독립적인 과제를 통해 기초를 가르칩니다. 다루는 주제는 다음과 같습니다:
이런 주제에 관심이 있다면, 추가 연습문제와 녹화된 세션이 있는 Emproof 기술 웨비나 시리즈도 확인해 보세요.
워크숍 콘텐츠는 Tim Blazytko가 설계하고 구성했으며, Simran Kathpalia가 지원했습니다.
환경을 설정하려면 저장소를 클론하세요:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
여러 작업에는 AArch64 Linux 실행 환경이 필요합니다. 일반적인 도구(예: GNU Binutils, Binwalk)가 사전 설치된 Kali Linux 기반 Docker 컨테이너를 제공합니다. 이를 통해 호스트 CPU 아키텍처와 관계없이 Linux, Windows, macOS에서 동일한 환경을 사용할 수 있습니다. 컨테이너를 시작하고 셸로 들어가려면 다음을 실행하세요:
./docker_run.sh
참고: 첫 실행은 이미지를 빌드하는 데 시간이 걸릴 수 있습니다.
참고(아키텍처): Docker Compose 서비스는
platform: "linux/arm64"로 설정되어 있습니다.
x86_64 호스트(Intel macOS/Windows/Linux)에서는 Docker Desktop이 에뮬레이션으로 이미지를 실행하므로 첫 빌드와 시작이 더 느릴 수 있습니다 — 이는 정상입니다. 네이티브 ARM64 호스트(Apple Silicon, ARM 서버)에서는 네이티브로 실행되어 더 빠릅니다.
참고: Docker 컨테이너는 ARMv7(armhf) 바이너리도 실행할 수 있습니다. 이미지에 armhf 런타임(동적 로더 + 라이브러리)을 설치하고 시작 스크립트를 통해
aarch64와arm모두에 대한 binfmt 핸들러를 등록합니다.
또한 대화형 리버스 엔지니어링 작업을 위해 호스트에 다음 GUI 도구를 설치하세요(컨테이너에는 포함되어 있지 않습니다):
두 도구 모두 Windows, Linux, macOS에서 사용할 수 있습니다.
참고: Binary Ninja Free는 AArch64를 지원하지 않습니다. AArch64 분석에는 Ghidra(또는 라이선스가 있는 Binary Ninja 빌드)를 사용하세요. 따라서 여러 실습에는 Binary Ninja Free용 ARMv7 동반 바이너리(
*.armv7)가 포함되어 있으며, 이들도 동일한 컨테이너에서 실행할 수 있습니다.
각 작업은 tasks/<name>/ 안에 독립적으로 포함되어 있으며 다음을 포함합니다:
samples/ — 실습에 사용되는 바이너리(및 때로는 소스)task.md — 단계별 지침과 힌트가 포함된 과제각 작업은 독립적으로 시도할 수 있지만, 난이도를 점진적으로 높이고 새로운 기법을 단계적으로 소개하는 권장 순서(아래에 나열)를 제공합니다. 대부분의 샘플은 ARMv7(Thumb/ARM32) 또는 AArch64를 대상으로 합니다. 해당되는 경우, 작업 노트는 아키텍처, 필요한 도구, 특별한 런타임 요구 사항을 명시합니다.
tasks/hello_world: ELF 파일 및 메타데이터 분석의 기초; Ghidra / Binary Ninja에서의 첫 단계.
tasks/license_check: 하드코딩된 비밀 추출 / 기능 잠금 해제; 검증을 우회하기 위한 기본 패칭(크래킹).
tasks/game: 간단한 숫자 맞추기 게임; 로직을 이해하고 트라이얼 모드와 전체 모드를 크랙.
tasks/keygenning_1: 라이선스 검증을 리버스하고 유효한 시리얼을 생성하는 최소 키젠을 작성.
tasks/keygenning_2: 약간 더 정교한 키젠 작업(솔트/키, 16진수 인코딩).
tasks/string_encryption: 암호화된 문자열이 있는 바이너리(악성코드에서 흔함); 복호화기를 식별하고 정적으로 문자열을 복구.
tasks/mirai: 문자열 복호화 루틴을 사용하는 임베디드 악성코드; 더 큰 코드베이스를 탐색하고, 흥미로운 구문을 식별하며, 난독화된 문자열을 처리.
tasks/embedded_linux_1: 파일시스템이 있는 임베디드 리눅스 펌웨어; 언패킹하고, 탐색하며, Linux 로그인 정보를 크랙(CTF 스타일).
tasks/embedded_linux_2: 유사하지만, 존재해서는 안 되는 숨겨진 바이너리를 찾아 분석.
tasks/car_demo: 베어메탈 펌웨어 분석: 아키텍처, 보드, 메모리 맵, 툴체인 산출물 식별; Wi-Fi 자격 증명 및 프로토콜 엔드포인트 추출.
tasks/iot_diag: 진단 도구의 베어메탈 펌웨어 덤프; 데이터시트에서 메모리 레이아웃을 재구성한 후 진단 모드를 잠금 해제하는 암호를 찾기.
tasks/crypto_detection: 하드코딩된 AES 키로 암호화 연산을 수행하는 AArch64 바이너리; EVP 호출을 찾고 key/IV를 역추적하여 프로그램 없이 복호화.
별도로 명시되지 않는 한, 이 저장소의 모든 워크숍 자료는 **GNU General Public License, 버전 2(GPL-2.0)**에 따라 라이선스가 부여됩니다. 전체 텍스트는 LICENSE를 참조하세요.
일부 타사/외부 출처 샘플은 GPL에서 제외되며 분석/교육 목적으로만 제공됩니다(재배포 불가). 대상은 다음과 같습니다:
참고: 하위 디렉터리에 자체 라이선스 파일이나 헤더가 포함된 경우, 해당 라이선스가 그 하위 디렉터리 내용에 우선 적용됩니다.
tasks/license_check_anti_patching: 코드 체크섬을 통한 안티-패칭; CRC 가드를 이해하고 우회 방법 학습.
tasks/fibonacci_obfuscation: 일반 vs 난독화된 Fibonacci 구현(스위치 평탄화, computed goto, opaque predicates, 산술 난독화, 소형 VM); 기법을 이해하고 정규화.