P 코드 분석을 통해 Go Binaries에서 문자열 정의를 복구하기위한 스크립트. X86, X86-64, ARM 및 ARM64로 테스트.
이것들은 스크립트 관리자의 Golang 카테고리에서 찾을 수 있습니다.
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json 에서로드됩니다.GoStringFiller.javago.string.*동적 문자열 분석 스크립트에는 몇 가지 특별한 변형이 있습니다.
GoDynamicStringsSingle.javaGoDynamicStrings.java 와 동일한 분석을 수행하지만 단일 디 컴파일러 프로세스를 사용합니다. 이진을 분석하면 병렬 디 컴파일러 프로세스가 시스템 메모리를 배출하는 경우이를 사용하십시오.GoDynamicStringsHigh.java스크립트 관리자의 PCODE 범주에서 찾을 수 있습니다.
PrintHighPCode.java다음은이 스크립트를 사용하여 Go Binary에서 문자열 정의를 복구하는 일반적인 흐름입니다.
.rodata , .rdata 또는 __rodata 에서 모든 문자열을 선택하십시오. 그런 다음 코드 목록을 마우스 오른쪽 버튼으로 클릭하고 "Clear Code Bytes"를 선택하십시오.GoKnownStrings.java 실행하여 일부 표준 문자열을 감지하십시오.GoStaticStrings.java 실행하십시오.GoFuncCallStrings.java 실행하십시오 (Golang 이진 버전이 Ghidra의 내장 Golang 기능에 의해 지원되는 경우) .GoDynamicStrings.java 실행하십시오.GoStringFiller.java 실행하십시오.go.string.*go.string.* 의 나머지 간격을 확인하고 명백한 시작 및 종말점이있는 문자열을 정의하십시오.GoStringFiller.java 를 가장 많이 사용하려면 정의되지 않은 문자열 데이터에서 문자열 길이가 어디에서 변경되는지 식별하고 해당 경계에 가장 가까운 문자열을 정의하십시오. 그런 다음 GoStringFiller.java 다시 실행하여 나머지 정의되지 않은 문자열의 길이를 올바르게 결정할 수있는 지점을 자동으로 채 웁니다.Ghidra에서 :
Ghidradev 플러그인이있는 Eclipse :
일식으로 빌드 :
Gradle과 직접 빌드 :
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > 리버스 엔지니어링 GO 프로그램의 잘 알려진 문제는 GO 스트링에 널 터미네이터가 부족하여 컴파일 된 바이너리에서 문자열 정의를 복구하는 것이 어렵다는 것입니다. 많은 GO 프로그램의 상수 문자열 값은 문자열 데이터에 내장 된 터미네이터 문자없이 컴파일 된 빌드의 하나의 거대한 블로브에 함께 저장되어 하나의 문자열이 끝나고 다른 문자열이 시작됩니다. "Hello World!" GO 런타임 시스템 및 기타 표준 라이브러리와 관련된 1,500 개 이상의 문자열이 있습니다. 이로 인해 GHIDRA가 제공 한 것과 같은 일반적인 ASCII 문자열 발견 구현은 수만 문자 길이의 허위 양수 문자열 정의를 생성 할 수 있습니다.
NULL 종료 문자열 대신 GO는 포인터 및 길이 값으로 구성된 문자열 구조를 사용합니다. 이러한 문자열 구조 중 다수는 런타임시 프로그램의 스택에 생성되므로 개별 문자열 시작 위치 및 길이 값을 복구하려면 컴파일 된 기계 코드를 분석해야합니다. 특정 패턴의 X86-64 지침을 확인 하여이 분석을 수행하는 몇 가지 기존 스크립트가 있지만, 결국 스택에 동일한 영향을 미치는 처리되지 않은 지침으로 생성 된 구조를 놓치며 특정 ISA로 제한됩니다.
GHOSTRINGS는 GHIDRA의 디 컴파일러 분석에서 생성 한 단순화 된 아키텍처 독립적 인 P 코드 작업을 통해 이러한 문제를 모두 피합니다.
저작권 2022 NCC 그룹. GPLV3 라이센스에 따라 릴리스 (라이센스 참조).
주요 프로젝트 저자 : James Chambers [email protected]