Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ghostrings — Go 바이너리에서 문자열 정의를 복구하기 위한 Ghidra 스크립트 | Kitploit
도구/GitHubGitHub/nccgroup/ghostrings
Code AnalysisReverse EngineeringBinary Analysis
GitHubnccgroup/ghostrings

ghostrings

Go 바이너리에서 문자열 정의를 복구하기 위한 Ghidra 스크립트

저장소 보기웹사이트
13898개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Ghostrings

P-Code 분석을 통해 Go 바이너리에서 문자열 정의를 복구하는 스크립트입니다. x86, x86-64, ARM 및 ARM64에서 테스트되었습니다.

스크립트

Golang

이 스크립트들은 Script Manager의 Golang 카테고리에서 찾을 수 있습니다.

  • GoDynamicStrings.java
    • 스택에 생성된 문자열 구조를 찾기 위해 P-Code를 분석합니다. 하위 수준의 "register" 스타일 분석을 사용합니다.
  • GoFuncCallStrings.java
    • 스택에 기록되지 않고 레지스터를 통해 함수 호출에 직접 전달되는 문자열 구조를 찾기 위해 P-Code를 분석합니다. Ghidra의 새로운 내장 Golang 지원과 함께 "normalize" 스타일 분석을 사용합니다(지원되는 Golang 버전은 Ghidra 릴리스 노트 참조).
  • GoStaticStrings.java
    • 읽기 전용 메모리에 정적으로 할당된 Go 문자열 구조를 찾습니다.
  • GoKnownStrings.java
    • 표준 고유 문자열을 검색하여 정의합니다. 문자열 데이터는 data/known_strings.json에서 로드됩니다.
  • GoStringFiller.java
    • 초기 분석 후 문자열 데이터의 오름차순 길이 순서에 따라 go.string.*의 빈 부분을 채웁니다.

동적 문자열 분석 스크립트의 특별한 변형도 몇 가지 있습니다:

  • GoDynamicStringsSingle.java
    • GoDynamicStrings.java와 동일한 분석을 수행하지만 단일 디컴파일러 프로세스를 사용합니다. 바이너리 분석 시 병렬 디컴파일러 프로세스가 시스템 메모리를 고갈시키는 경우 이 스크립트를 사용하세요.
  • GoDynamicStringsHigh.java
    • 실험적이며, 더 높은 수준의 "normalize" 스타일 분석의 P-Code 출력을 사용합니다. 현재 디컴파일러에서 데드코드 제거를 끄는 핵(hack)에 의존합니다(https://research.nccgroup.com/2022/05/20/earlyremoval-in-the-conservatory-with-the-wrench/ 참조). 이 핵은 Ghidra 10.2에서 작동하지 않습니다.

P-Code

이 스크립트는 Script Manager의 PCode 카테고리에서 찾을 수 있습니다.

  • PrintHighPCode.java
    • 현재 선택된 함수에 대한 상위(high) P-Code 출력을 콘솔에 출력하며, 사용할 디컴파일러 단순화 스타일 선택기를 제공합니다. 주로 P-Code 분석 스크립트 개발에 사용됩니다.

문자열 복구 흐름

Go 바이너리에서 문자열 정의를 복구하기 위해 이러한 스크립트를 사용하는 일반적인 흐름은 다음과 같습니다:

  1. 읽기 전용 데이터 메모리 블록에서 잘못되었거나 자동으로 정의된 모든 문자열을 지웁니다.
    • "Defined Strings" 창에서 "Mem Block" 열을 활성화하고 메모리 블록으로 필터링하여 .rodata, .rdata 또는 __rodata의 모든 문자열을 선택합니다. 그런 다음 코드 목록에서 마우스 오른쪽 버튼을 클릭하고 "Clear Code Bytes"를 선택합니다.
  2. (선택 사항) GoKnownStrings.java를 실행하여 일부 표준 문자열을 감지합니다.
  3. GoStaticStrings.java를 실행합니다.
  4. GoFuncCallStrings.java를 실행합니다 (Ghidra의 내장 Golang 기능이 해당 Golang 바이너리 버전을 지원하는 경우).
  5. GoDynamicStrings.java를 실행합니다.
  6. GoStringFiller.java를 실행합니다.
    • 문자열 데이터의 오름차순 길이 순서 위반이 감지되면 해당 영역의 오탐(false positive) 문자열 정의를 지우고 스크립트를 다시 실행합니다. 이를 자동으로 수행하는 옵션이 있습니다.
    • 바이너리가 stripped된 경우 동적 문자열 스크립트가 찾은 1바이트 문자열 영역을 찾습니다. 그것이 그룹화된 null 종료되지 않은 문자열의 시작인지 확인합니다(이후에 길이가 오름차순인 추가 문자열이 정의되어야 합니다). 첫 번째 1바이트 문자열에 go.string.* 레이블을 만듭니다.
  7. go.string.*에 남은 간격이 있는지 확인하고 명확한 시작점과 끝점이 있는 문자열을 정의합니다.
    • GoStringFiller.java를 최대한 활용하려면 정의되지 않은 문자열 데이터에서 문자열 길이가 변경되는 지점을 식별하고 해당 경계에 가장 가까운 문자열을 정의하세요. 그런 다음 를 다시 실행하여 나머지 정의되지 않은 문자열의 길이를 올바르게 결정할 수 있는 부분을 자동으로 채웁니다.

설정

설치

Ghidra에서:

  1. File -> Install Extensions -> Add extension
  2. 확장 프로그램 ZIP 파일을 선택합니다.

개발

GhidraDev 플러그인이 있는 Eclipse의 경우:

  1. 저장소를 클론합니다.
  2. File -> Import -> Projects from Folder or Archive
  3. 저장소 디렉터리를 선택합니다.
  4. GhidraDev -> Link Ghidra...
  5. 가져온 프로젝트를 선택합니다.

빌드

Eclipse로 빌드:

  • GhidraDev -> Export -> Ghidra Module Extension...

Gradle로 직접 빌드:

root@kitploit:~
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>

배경

Go 프로그램을 리버스 엔지니어링할 때 잘 알려진 문제 중 하나는 Go 문자열에 null 종결자가 없어 컴파일된 바이너리에서 문자열 정의를 복구하기 어렵다는 것입니다. Go 프로그램의 많은 상수 문자열 값은 컴파일된 빌드에서 하나의 거대한 블롭(blob)으로 함께 저장되며, 문자열 데이터에 한 문자열이 끝나고 다른 문자열이 시작되는 위치를 표시하는 종결자 문자가 없습니다. 단순히 "Hello world!"를 출력하는 간단한 프로그램조차도 Go 런타임 시스템 및 기타 표준 라이브러리와 관련된 1,500개 이상의 문자열을 포함합니다. 이로 인해 Ghidra가 제공하는 것과 같은 일반적인 ASCII 문자열 검색 구현이 수만 자 길이의 오탐 문자열 정의를 생성할 수 있습니다.

Go는 null 종결자 문자열 대신 포인터와 길이 값으로 구성된 문자열 구조를 사용합니다. 이러한 문자열 구조 중 상당수는 런타임에 프로그램의 스택에서 생성되므로 개별 문자열의 시작 위치와 길이 값을 복구하려면 컴파일된 기계어 코드를 분석해야 합니다. 특정 x86-64 명령어 패턴을 확인하여 이 분석을 수행하는 기존 스크립트가 몇 가지 있지만, 궁극적으로 스택에 동일한 효과를 주는 처리되지 않은 명령어 변형으로 생성된 구조를 놓치며 특정 ISA로 제한됩니다.

Ghostrings는 Ghidra의 디컴파일러 분석이 생성하는 단순화된 아키텍처 독립적 P-Code 연산을 사용하여 이 두 가지 문제를 모두 피합니다.

릴리스 정보

Copyright 2022 NCC Group. GPLv3 라이선스로 배포됩니다(LICENSE 참조).

프로젝트 주요 작성자: James Chambers [email protected]

도구 다운로드
GoStringFiller.java
  • (선택 사항) Ghidra에 내장된 ASCII 문자열 분석 도구를 다시 실행합니다.
    • 기존 문자열 덮어쓰기를 비활성화합니다. null 종결자 요구 사항을 적용한 상태와 적용하지 않은 상태로 각각 실행합니다.