1P by neo 27일전 | favorite | 댓글과 토론

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 플러그인 활성화

사용법

  1. Listing 뷰에서 주소 집합 선택
  2. Relocation table synthesizer 분석기 실행 (원샷 모드에서 사용 가능)
  3. File > Export Program…을 통해 재배치 가능한 오브젝트 파일 익스포터 호출
  4. Window > Relocation table(synthesized)에서 재구성된 재배치 테이블 확인 가능
  • ⚠️ Relocation table synthesizer 분석기는 완전히 채워진 Ghidra 데이터베이스(정확히 선언된 심볼, 데이터 타입 및 참조)를 필요로 함. 부정확하거나 누락된 정보는 분석 중에 잘못된 또는 발견되지 않은 재배치를 초래할 수 있음
  • ⚠️ 오브젝트 파일 익스포터는 Relocation table synthesizer 분석기의 결과에 의존함. 오브젝트 파일을 내보내기 전에 이 분석기를 실행하여 재배치 테이블 내용이 최신 상태인지 확인

작동 원리

오브젝트 파일은 세 부분으로 구성됨:

  • 재배치 가능한 섹션 바이트
  • 심볼 테이블
  • 재배치 테이블

링커가 여러 오브젝트 파일에서 실행 파일을 생성할 때:

  • 섹션을 메모리에 배치
  • 가상 주소 공간에서 심볼의 주소를 계산
  • 섹션 바이트에 심볼의 최종 주소를 기반으로 재배치를 적용

일반적으로 이 과정 후 재배치 테이블은 폐기되며, 디버깅 심볼이 유지되지 않는 한 심볼 테이블도 폐기됨. 그러나 신중한 분석을 통해 이 데이터를 재생성할 수 있으며, 이를 통해 프로그램을 다시 오브젝트 파일로 _delink_할 수 있음.

GN⁺의 정리

  • 이 Ghidra 확장은 프로그램의 일부를 오브젝트 파일로 내보낼 수 있게 해줌.
  • 고급 바이너리 패칭, 소프트웨어 포팅, 파일 형식 변환 등 다양한 사용 사례가 있음.
  • 정확한 데이터베이스가 필요하며, 분석기 실행 후 오브젝트 파일을 내보내는 것이 중요함.
  • 비슷한 기능을 제공하는 프로젝트로는 IDA Pro와 같은 디컴파일러가 있음.