GN⁺: HN 공개: 프로그램의 일부를 오브젝트 파일로 내보내는 Ghidra 확장 프로그램
(github.com/boricj)Ghidra용 오브젝트 파일 익스포터 확장
이 Ghidra 확장은 프로그램의 일부를 오브젝트 파일로 내보낼 수 있게 해줌. 이 오브젝트 파일들은 유효한 메타데이터(심볼, 재배치 테이블 등)를 가지고 있어 도구 체인에 의해 직접 재사용될 수 있음.
사용 사례
- 고급 바이너리 패칭: 원본과 수정된 부분을 수작업 대신 링커를 활용해 결합
- 소프트웨어 포팅: 시스템 독립적인 코드를 프로그램에서 분리하고 나머지를 교체
- 파일 형식 변환: 프로그램이나 오브젝트 파일을 다른 파일 형식으로 변환
- 라이브러리 생성: 프로그램의 일부를 추출하여 다른 컨텍스트에서 재사용
- 디컴파일 프로젝트: 프로그램을 여러 오브젝트 파일로 분할하고 재구현
지원되는 명령어 집합 아키텍처 및 오브젝트 파일 형식
- x86: COFF(지원), ELF(지원)
- MIPS: COFF(미지원), ELF(지원)
빌드 (CLI)
- 이 저장소를 클론
-
GHIDRA_INSTALL_DIR
환경 변수를 Ghidra 설치 디렉토리로 설정 -
gradle buildExtension
명령 실행 - Ghidra 확장 아카이브가
dist/
디렉토리에 생성됨
설치
- 릴리스 페이지에서 확장을 다운로드하거나 로컬에서 빌드
- Ghidra 인스턴스에서
File > Install Extensions…
로 확장 설치 - CodeBrowser 창에서
File > Configure
를 통해RelocationTableSynthesizedPlugin
플러그인 활성화
사용법
- Listing 뷰에서 주소 집합 선택
-
Relocation table synthesizer
분석기 실행 (원샷 모드에서 사용 가능) -
File > Export Program…
을 통해 재배치 가능한 오브젝트 파일 익스포터 호출 -
Window > Relocation table(synthesized)
에서 재구성된 재배치 테이블 확인 가능
- ⚠️ Relocation table synthesizer 분석기는 완전히 채워진 Ghidra 데이터베이스(정확히 선언된 심볼, 데이터 타입 및 참조)를 필요로 함. 부정확하거나 누락된 정보는 분석 중에 잘못된 또는 발견되지 않은 재배치를 초래할 수 있음
- ⚠️ 오브젝트 파일 익스포터는 Relocation table synthesizer 분석기의 결과에 의존함. 오브젝트 파일을 내보내기 전에 이 분석기를 실행하여 재배치 테이블 내용이 최신 상태인지 확인
작동 원리
오브젝트 파일은 세 부분으로 구성됨:
- 재배치 가능한 섹션 바이트
- 심볼 테이블
- 재배치 테이블
링커가 여러 오브젝트 파일에서 실행 파일을 생성할 때:
- 섹션을 메모리에 배치
- 가상 주소 공간에서 심볼의 주소를 계산
- 섹션 바이트에 심볼의 최종 주소를 기반으로 재배치를 적용
일반적으로 이 과정 후 재배치 테이블은 폐기되며, 디버깅 심볼이 유지되지 않는 한 심볼 테이블도 폐기됨. 그러나 신중한 분석을 통해 이 데이터를 재생성할 수 있으며, 이를 통해 프로그램을 다시 오브젝트 파일로 _delink_할 수 있음.
GN⁺의 정리
- 이 Ghidra 확장은 프로그램의 일부를 오브젝트 파일로 내보낼 수 있게 해줌.
- 고급 바이너리 패칭, 소프트웨어 포팅, 파일 형식 변환 등 다양한 사용 사례가 있음.
- 정확한 데이터베이스가 필요하며, 분석기 실행 후 오브젝트 파일을 내보내는 것이 중요함.
- 비슷한 기능을 제공하는 프로젝트로는 IDA Pro와 같은 디컴파일러가 있음.