IDAPro를 위한 또 다른 Golang 바이너리 파서
영어 | 중국어
참고:
현재 최신 master 브랜치는 Python3 버전입니다. 이전 master 브랜치는 py2 브랜치로 변경되었으며 임시로 유지보수되지 않습니다.
Python3 브랜치 사용법
이 버전은 macOS/Windows, IDA7.4+ 및 Python3.8.x에서 개발 및 테스트되었습니다.
다른 플랫폼이나 버전에서 문제가 발생하면 이슈나 Pull Request를 제출해 주세요.
또한 macOS의 IDA7.4는 기본적으로 설치된 Python3를 사용하므로, 사용자가 설치한 타사 라이브러리가 로드되지 않을 수 있습니다. brew로 설치된 Python으로 전환해야 합니다. 구체적인 전환 방법은 이 스크립트를 참조하세요.
golang_loader_assist와 jeb-golang-analyzer에서 영감을 받아 IDAPro용 보다 완전한 Go 바이너리 파싱 도구를 작성했습니다.
주요 기능:
- Go 바이너리 파일에서 firstmoduledata 구조를 찾아 파싱하고 각 필드에 주석을 추가합니다;
- firstmoduledata를 기반으로 pclntab(PC 라인 테이블)을 찾아 파싱합니다. 그런 다음 pclntab에서 함수 이름과 소스 파일 경로를 찾아 파싱하고 복구합니다. 소스 파일 경로는 IDAPro의 출력 창에 출력됩니다;
- 문자열과 문자열 포인터를 파싱하고 각 문자열에 주석을 추가하며 각 문자열 포인터에 dref를 생성합니다;
- firstmoduledata를 기반으로 각 type을 찾아 파싱하고, 각 type의 속성에 주석을 추가합니다. 이는 맬웨어 연구자가 복잡한 타입이나 데이터 구조 정의를 분석하는 데 매우 편리합니다;
- itab(인터페이스 테이블)을 파싱합니다.
Go 바이너리 리버스 엔지니어링에 유용한 정보:

또한 go_parser에는 두 가지 유용한 기능이 있습니다:
- 파일 헤더 정보가 잘못된 바이너리, 특히 잘못된 섹션 헤더 정보가 있는 바이너리에서도 잘 작동합니다;
- 위의 모든 기능은 buildmode=pie로 빌드된 바이너리에서도 유효합니다.
DDGMiner v5029 (MD5: 95199e8f1ab987cd8179a60834644663)의 설정 데이터 구조 파싱 결과는 다음과 같습니다:

사용자 정의 소스 파일 경로 목록:

프로젝트 파일:
- go_parser.py: 진입 파일, [Alt+F7] 을 누르고 이 파일을 선택하여 실행합니다;
- common.py: 공통 변수 및 함수 정의;
- pclntbl.py: pclntab(PC 라인 테이블) 파싱;
- strings.py: 문자열 및 문자열 포인터 파싱;
- moduldata.py: firstmoduledata 파싱;
- types_builder.py: types 파싱;
- itab.py: itab(인터페이스 테이블) 파싱;
또한 str_ptr.py는 문자열 포인터의 시작 주소와 끝 주소를 수동으로 지정하여 문자열 포인터를 파싱합니다.
참고
- 이 도구는 Python3로 작성되었으며 IDA7.4+에서 테스트되었습니다;
- 문자열 파싱 모듈은 golang_loader_assist에서 가져왔으며, 문자열 포인터 파싱 기능을 추가했습니다. 현재는 x86(32비트 및 64비트) 아키텍처만 지원합니다.
참고 자료
- Golang 실행 파일 분석
- 프로처럼 GO 바이너리 리버싱
- Go 바이너리에서 프로그램 의미 재구성.pdf
- Go二进制文件逆向分析从基础到进阶——综述
- Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表
- Go二进制文件逆向分析从基础到进阶——数据类型
- Go二进制文件逆向分析从基础到进阶——itab与strings
- Go二进制文件逆向分析从基础到进阶——Tips与实战案例