- 이 Ghidra 확장 프로그램은 프로그램의 일부를 오브젝트 파일로 내보내며, 내보낸 파일은 심볼과 재배치 테이블 같은 유효한 메타데이터를 포함해 툴체인에서 다시 처리할 수 있음
- 주요 용도는 고급 바이너리 패치, 소프트웨어 포팅, 파일 형식 변환, 라이브러리 생성, 디컴파일 프로젝트에서 프로그램을 여러 오브젝트 파일로 나눠 재구현하는 작업임
- 지원 조합은 COFF x86/x86_64, ELF x86/x86_64/MIPS, OMF x86이며, COFF MIPS·OMF x86_64·OMF MIPS는 지원하지 않음
- 사용자는 Ghidra Listing에서 추출할 주소 범위를 선택하고 Relocation table synthesizer 분석기를 실행한 뒤,
File > Export Program…에서 재배치 가능한 오브젝트 파일 exporter를 호출함 - 재배치 테이블 합성은 Ghidra 데이터베이스 정확도에 의존하므로 잘못되거나 누락된 정보가 있으면 재배치가 깨지거나 누락될 수 있고, 내보내기 직전에 분석기를 다시 실행하는 것이 안전함
무엇을 하는 확장 프로그램인가
- Object file exporter extension for Ghidra는 프로그램의 일부를 오브젝트 파일로 내보낼 수 있게 하는 Ghidra 확장 프로그램임
- 생성된 오브젝트 파일은 심볼, 재배치 테이블 같은 유효한 메타데이터를 포함함
- 이 메타데이터 덕분에 내보낸 오브젝트 파일을 툴체인에서 직접 재사용해 추가 처리할 수 있음
활용 사례
- Advanced binary patching
- 원본 부분과 수정된 부분을 수작업으로 맞추는 대신 링커를 활용해 함께 맞물리게 할 수 있음
- Software ports
- 프로그램에서 시스템 독립적인 코드를 분리하고 나머지를 대체할 수 있음
- 프로그램이나 오브젝트 파일을 한 파일 형식에서 다른 파일 형식으로 변환할 수 있음
- 프로그램 일부 추출과 라이브러리 생성
- 프로그램 일부를 추출해 다른 맥락에서 재사용할 수 있음
- 디컴파일 프로젝트에서는 프로그램을 여러 오브젝트 파일로 나누고, 이를 Ship of Theseus 방식으로 재구현할 수 있음
지원 아키텍처와 오브젝트 파일 형식
- 지원 매트릭스는 다음과 같음
- COFF: x86, x86_64 지원 / MIPS 미지원
- ELF: x86, x86_64, MIPS 지원
- OMF: x86 지원 / x86_64, MIPS 미지원
빌드와 설치
- CLI 빌드 절차
- 저장소를 clone함
GHIDRA_INSTALL_DIR환경 변수를 Ghidra 설치 디렉터리로 지정함gradle buildExtension을 실행함- 생성된 Ghidra 확장 아카이브는
dist/디렉터리에 만들어짐
- GitHub Maven 저장소에서 패키지를 내려받으려면 인증이 필요함
read:packages권한이 있는 GitHub classic token을 만들고${GRADLE_USER_HOME}/gradle.properties에githubToken=ghp_xxx를 추가함- 또는
gradle installStandaloneDeps를 실행해 submodule의 vendored dependency를 빌드하고 설치함
- 설치 절차
- releases page에서 확장을 내려받거나 로컬에서 빌드함
- Ghidra에서 File > Install Extensions… 로 확장을 설치함
- CodeBrowser 창의 File > Configure > Experimental에서 RelocationTableSynthesizedPlugin 플러그인을 활성화함
사용 흐름과 주의점
- 기본 사용 절차
- Listing 뷰에서 추출할 주소 집합을 선택함
- one-shot mode로 제공되는 Relocation table synthesizer 분석기를 실행함
- File > Export Program… 에서 재배치 가능한 오브젝트 파일 exporter를 호출함
- 재구성된 재배치는 Window > Relocation table (synthesized) 에서 볼 수 있음
- 상세 평가 리포트는 Analysis > Auto Analyze... 대화상자에서 Relocation table synthesizer 분석기의 Evaluation report policy 옵션을 설정해 활성화할 수 있음
- 확장 프로그램을 쓰기 전에 전체 프로그램을 미리 모두 리버스 엔지니어링할 필요는 없음
- 성공적인 delinking은 일반적으로 내보낼 부분과 외부 참조 안의 메타데이터에 크게 의존함
- 재배치 위치로 쓰이는 함수와 포인터
- 재배치 대상으로 쓰이는 심볼 footprint
- 둘 사이의 참조
- Relocation table synthesizer 분석기는 Ghidra 데이터베이스의 정확도에 의존함
- 부정확하거나 누락된 정보는 분석 중 깨진 재배치나 누락된 재배치로 이어질 수 있음
- 오브젝트 파일 exporter는 Relocation table synthesizer 분석 결과에 의존함
- 의심스러운 경우 오브젝트 파일을 내보내기 직전에 분석기를 실행해 재배치 테이블이 최신인지 확인해야 함
동작 원리
- 오브젝트 파일은 세 부분으로 구성됨
- 재배치 가능한 섹션 바이트
-
심볼 테이블
- 재배치 테이블
- 링커가 여러 오브젝트 파일에서 실행 파일을 만들 때 수행하는 작업
- 섹션을 메모리에 배치함
- 가상 주소 공간에서 심볼 주소를 계산함
- 최종 심볼 주소를 기준으로 섹션 바이트에 재배치를 적용함
- 일반적으로 이 과정이 끝나면 재배치 테이블은 폐기됨
- 디버깅 심볼이 유지되지 않으면 심볼 테이블도 폐기되고, 재배치할 수 없는 섹션 바이트만 남음
- 이 확장은 신중한 분석으로 해당 데이터를 다시 만들 수 있으며, 이를 통해 프로그램을 다시 오브젝트 파일로 delink할 수 있음