
Ghidra 확장 프로그램으로, PC 펌웨어 리버스 엔지니어링을 위한 도구입니다. PCI 옵션 ROM, Intel Flash Descriptor, coreboot CBFS, UEFI 펌웨어 볼륨용 로더를 제공하며, 타입 복구 및 GUID 식별을 위한 UEFI 헬퍼 스크립트도 포함합니다.
PC 펌웨어 리버스 엔지니어링을 지원하는 Ghidra용 다양한 모듈입니다. 이 프로젝트는 GSoC 2019의 coreboot 프로젝트로 채택되었습니다.
JDK 21(이상)과 Ghidra 12.0(이상)이 필요합니다.
Ghidra의 표준 Gradle 빌드 시스템이 사용됩니다. 빌드 전에 GHIDRA_INSTALL_DIR
환경 변수를 설정하거나 Gradle 속성으로 설정하십시오(IDE에서 빌드할 때 유용):
$ export GHIDRA_INSTALL_DIR="/path/to/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/path/to/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIR은support/buildExtension.gradle이 포함된 디렉토리를 가리켜야 합니다. 예를 들어, Flathub 패키지 사용자는/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra를 사용해야 합니다.
모듈 ZIP은 dist/에 출력됩니다. File > Install Extensions를 사용하고
녹색 더하기를 선택하여 확장 프로그램을 찾아보십시오. 메시지가 표시되면 Ghidra를 다시 시작하십시오.
올바른 기능을 위해 플러그인은 Ghidra 설치에 사용된 것과 동일한 JRE로
빌드되어야 합니다. 여러 Java 런타임 환경이 설치된 경우, 빌드 전에
JAVA_HOME 환경 변수를 설정하여 올바른 JRE를 선택하십시오.
Ghidra 프로젝트에 PCI 옵션 ROM을 추가하십시오. 레거시 x86 옵션 ROM은 분석을 위해 직접 로드할 수 있습니다. 바이너리 형식이 x86 PCI Option ROM으로 설정되어 있는지 확인하고 바이너리를 가져오십시오.
UEFI 옵션 ROM 또는 둘 이상의 이미지를 포함하는 옵션 ROM은 파일시스템 로더를 사용하여 가져와야 합니다. 가져오기 모드를 선택하라는 메시지가 표시되면 File system을 선택하십시오. 옵션 ROM에 포함된 이미지가 표시되며 분석을 위해 가져올 수 있습니다. 레거시 x86 이미지는 x86 PCI Option ROM 로더로 처리되고, UEFI 이미지는 PE32 로더로 처리됩니다(압축 지원). 각 이미지에 대한 정보는 마우스 오른쪽 버튼 메뉴에서 Get Info를 선택하여 표시할 수 있습니다.
Ghidra 프로젝트에 지원되는 펌웨어 이미지를 추가하십시오. 펌웨어 이미지 로더는 Flash Descriptor가 있는 Intel 이미지, FMAP/CBFS 레이아웃이 있는 coreboot 이미지, 그리고 UEFI 펌웨어 볼륨을 지원합니다. File system 가져오기 모드를 사용하여 지정된 펌웨어 이미지 내에 포함된 파일을 볼 수 있습니다.
일부 UEFI 펌웨어 이미지는 freeform/raw 파일(또는 freeform/raw FFS 섹션) 내에
중첩 펌웨어 볼륨을 저장할 수 있습니다. 이러한 파일은 지정된 freeform/raw 파일에 대한
마우스 오른쪽 버튼 메뉴에서 Open File System을 선택하여 펌웨어 볼륨으로
가져올 수 있습니다. 중첩 펌웨어 볼륨이 없으면 오류 메시지가 표시됩니다
(No file system provider for...).
헬퍼 스크립트는 플러그인의 ghidra_scripts 디렉토리에 포함되어 있으며, 이 디렉토리는 Ghidra의 스크립트 디렉토리 목록에 자동으로 추가되어야 합니다.
Script Manager 창(Window -> Script Manager에서 접근)에서 UEFIHelper.java를 선택하여 UEFI 헬퍼 스크립트를 실행하십시오.
UEFI 데이터 타입 라이브러리를 수정하려면 data/gen_prf.sh의 PRF 템플릿을
필요에 따라 수정하고 새 PRF 파일을 생성하십시오. 생성된 PRF 파일을
File -> Parse C Source에서 여십시오. **Parse to File...**을 선택하여
업데이트된 데이터 타입 라이브러리를 빌드하십시오. data의 원본 데이터 타입
라이브러리를 덮어쓰고 플러그인을 다시 빌드하십시오.
UEFI 리버싱과 관련된 흥미로운 프로젝트들입니다:
Apache 2.0, 일부 예외:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c는 uefi-firmware-parser의
Decompress.c를 약간 수정한 버전입니다(그 자체는
EDK2 BaseTools의 원본에서 파생됨).
src/main/java/firmware/ifd의 IFD FS 로더는 UEFITool의
파서를 참조로 사용했습니다.
data/guids.csv의 GUID 데이터베이스는 UEFITool에서 가져왔습니다.
data/uefi_*.gdt의 UEFI 데이터 타입 라이브러리는 wrffrz의 Ghidra 풀 리퀘스트의
UEFI 파서 정의를 부분적으로 기반으로 한 data/gen_prf.sh로 생성되었습니다.
이 데이터 타입 라이브러리는 EDK2 MdePkg의 헤더를 사용합니다.
UEFI 헬퍼 스크립트의 일부 부분은 xerpi의 GhidraVitaLoader를 참조로 사용했습니다.