AlphaGolang
by Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
설명:
AlphaGolang은 IDAPython 스크립트 모음으로, 맬웨어 리버스 엔지니어가 Go 바이너리를 마스터하는 데 도움을 주기 위해 만들어졌습니다. 아이디어는 스크립트를 구체적인 단계로 나누어 깨지기 쉬운 모놀리식 스크립트를 피하고, 분석가가 Go 바이너리를 다룰 때 따를 수 있는 방법론을 모방하는 것입니다.
스크립트는 GPL 라이선스로 배포됩니다 (Tim Strazzere의 원본 GolangLoaderAssist를 리팩터링하고 Python3용으로 업데이트했으며, Tim에게 감사를 표합니다 :)). 기여는 언제나 환영합니다!
요구사항: IDA Pro (이상적으로 v7.6+) 및 Python3 (ew)
처음 두 단계(recreate_pclntab 및 function_discovery_and_renaming)는 IDA v7.5-에서도 작동하지만, 이후 스크립트는 IDAv7.6+가 필요합니다. 최신 버전은 향후 스크립트의 이상적인 대상입니다.
원본 참고: Mandiant Cyber Defense Summit 2021 발표 (동영상 예정)
AlphaGolang 분석 방법론
-
단계 0: Go 바이너리 식별을 위한 YARA 규칙 (PE/ELF/MachO)
- identify_go_binaries.yara
- 간단한 헤더 검사 + Go 빌드 ID 문자열 정규식.
- 빌드 ID 길이 범위를 개선할 수 있을 것입니다.
-
단계 1: pcln 테이블 재생성
- recreate_pclntab.py (IDA v7.5- 호환)
- 휴리스틱을 기반으로 gopclntab 섹션을 재생성합니다.
- 주로 IDA v7.5-에서 유용합니다.
-
단계 2: pcln 테이블을 순회하여 함수를 찾고 모든 함수에 이름을 추가
- function_renaming.py (IDA v7.5- 호환)
- golang_loader_assist에서 분리됨
- pcln 테이블을 기반으로 누락된 함수를 무차별 대입 방식으로 발견합니다.
- py3 전환 과정에서 발생한 일부 함수 이름 정리 문제를 수정했습니다.
- Akamai의 Panchan!을 기반으로 Go v1.18에 대한 개선 사항을 추가하도록 리팩터링되었습니다. Alex(CycleOfTheAbsurd)에게 감사드립니다.
-
단계 3: 사용자 생성 함수 표면화
- categorize_go_folders.py (IDA v7.6+ 필요)
- 함수를 자동으로 폴더로 분류합니다.
- IDAv7.6+ 필요 및 함수 보기에서 '폴더 표시'가 활성화되어 있어야 합니다.
- 업데이트 2022.05.16: IDA v7.7 폴더 정렬과의 충돌 수정
- 이 플러그인을 실행하기 전에 Lumina의 메타데이터를 되돌리는 것을 강력히 권장합니다.
-
단계 4: 문자열 참조 수정
- fix_string_cast.py
- golang_loader_assist에서 분리됨
- 새 문자열을 정의하기 전에 기존 문자열 블롭을 정의 해제하는 로직 추가
- 새로운 무결성 검사로 훨씬 더 효과적
-
단계 5: 타입 정보 추출 (Ivan Kwiatkowski 작성)
- extract_types.py
newobject, makechan 등에 대한 모든 호출의 인수에 주석을 추가합니다.
- 이러한 객체에 올바른 C 타입을 적용하고 이름을 바꿉니다.
- 사람이 읽을 수 있는 이름을 가져와 주석으로 추가합니다.
수정해야 할 사항 및 기여할 부분:
- fix_string_cast.py
- 여전히 리팩터링과 더 나은 문자열 로드 휴리스틱이 필요합니다.
- 대규모 바이너리에서 잠길 수 있습니다.
- 일부 간접 문자열 로드 메커니즘이 누락되었습니다.
- extract_types.py
- 현재 PE 및 Mach-O 파일에서 하드코딩된
.rdata 또는 __rodata 섹션 이름을 찾아서 작동합니다.
- 가변 정수 인코딩된 크기에 대한 적절한 검사/구현이 필요합니다.
다음 단계:
- 사용자 생성 함수가 참조하는 문자열 추적
- 사용자 생성 함수를 기반으로 YARA 시그니처 자동 생성
- 사용자 생성 함수에 대한 hex-rays pseudocode 출력 생성
- 동적 분석을 위한 인수에 자동으로 중단점 설정
- ???
감사:
- Tim Strazzere: 원본 golang_loader_assist를 공개해 주셔서 감사합니다.
- Milan Bohacek (Avast Software s.r.o.): idatree API를 이해하는 데 귀중한 도움을 주셨습니다.
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT): 단계 5 제공
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (일명 CycleOfTheAbsurd) from ESET: Go v1.18 지원을 위해 단계 2를 리팩터링해 주셨습니다.