Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
GoReSym — Go 바이너리를 파싱하여 심볼, 함수 메타데이터, 타입, 파일 경로, 내장 문자열을 복구하며, 스트리핑되었거나 UPX로 패킹된 샘플도 포함하고 IDA Pro 가져오기를 지원합니다. | Kitploit
도구/GitHubGitHub/mandiant/goresym
Static AnalysisReverse EngineeringDebuggersInformation GatheringMalware AnalysisDigital ForensicsBinary Analysis
GitHubmandiant/goresym

GoReSym

Go 바이너리를 파싱하여 심볼, 함수 메타데이터, 타입, 파일 경로, 내장 문자열을 복구하며, 스트리핑되었거나 UPX로 패킹된 샘플도 포함하고 IDA Pro 가져오기를 지원합니다.

저장소 보기
1.1k113111개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

GoReSym

GoReSym Logo

GoReSym은 프로그램 메타데이터(CPU 아키텍처, OS, 엔디언, 컴파일러 버전 등), 함수 메타데이터(시작 및 종료 주소, 이름, 소스), 파일 이름 및 줄 번호 메타데이터, 그리고 내장된 구조체와 타입을 추출하는 Go 심볼 파서입니다. 이 크로스 플랫폼 프로그램은 오픈 소스 Go 컴파일러와 런타임 코드를 직접 기반으로 합니다.

업스트림 Go 런타임 코드는 다음을 처리하도록 확장되었습니다:

  • 스트립된 바이너리
  • UPX 등으로 인해 잘못된 언패킹 바이너리
  • 단일 데이터 범위를 여러 섹션에 걸쳐 분할하는 바이너리
  • moduledata 구조체의 위치

사용법

리버스 엔지니어링 세부 사항과 사용 예시는 https://www.mandiant.com/resources/blog/golang-internals-symbol-recovery 를 참조하십시오.

미리 빌드된 linux, macos, windows GoReSym 바이너리는 Releases 탭에서 다운로드할 수 있습니다.

최신 Go 컴파일러로 소스에서 빌드하려면 Go 컴파일러를 실행하십시오:

go build

GoReSym은 다음과 같이 빌드한 후 호출하세요:

GoReSym.exe -t -d -p /path/to/input.exe

이 예제에서는 /path/to/input.exe 파일에 포함된 타입 이름(-t), 사용자 패키지 이름, 표준 Go 패키지 이름(-d), 입력 파일 경로(-p)를 복구하도록 GoReSym에 요청합니다. 출력은 다음과 같습니다:

{
    "Version": "1.14.15",
    "BuildId": "Zb9QmokKTiOUgHKmaIwz/wd2rtE3W9PN-um1Ocdzh/qTdqcTY_jVajHy_-TtYv/Z_kJu9M77OjfijEiHMcF",
    "Arch": "amd64",
    "TabMeta": {
        "VA": 5174784,
        "Version": "1.2",
        "Endianess": "LittleEndian",
        "CpuQuantum": 1,
        "CpuQuantumStr": "x86/x64",
        "PointerSize": 8
    },
    "ModuleMeta": {
        "VA": 5678816,
        "Types": 4845568,
        "ETypes": 5171904,
        "Typelinks": {
            "Data": 5171904,
            "Len": 695,
            "Capacity": 695
        },
        "ITablinks": {
            "Data": 5174688,
            "Len": 11,
            "Capacity": 11
        },
        "LegacyTypes": {
            "Data": 0,
            "Len": 0,
            "Capacity": 0
        }
    },
    "Types": [ ... ],
    "Files": [ ... ],
    "Strings": [ ... ],
    "UserFunctions": [ ... ],
    "StdFunctions": [ ... ]
}

사용 가능한 모든 플래그는 다음과 같습니다:

  • -d ("default", 선택 사항) 플래그는 사용자 패키지에 더해 표준 Go 패키지도 출력합니다.
  • -p ("paths", 선택 사항) 플래그는 pclntab에 포함된 모든 파일 경로를 출력합니다.
  • -t ("types", 선택 사항) 플래그는 Go 타입 이름을 출력합니다.
  • -strings (선택 사항) 플래그는 문자열 인터님 테이블을 분석하여 바이너리에 포함된 Go 문자열을 추출합니다.
  • -m <virtual address> ("manual", 선택 사항) 플래그는 주어진 가상 주소에서 RTYPE 구조체를 재귀적으로 덤프합니다
  • -v <version string> ("version", 선택 사항) 플래그는 자동 버전 감지를 무시하고 제공된 버전을 사용합니다. 일부 스트립된 바이너리의 경우 필요합니다. 버전이 정확하지 않으면 타입 파싱이 실패합니다.
  • -human (선택 사항) 플래그는 JSON 대신 평문 텍스트 목록을 출력합니다. 구조체 및 인터페이스 타입을 출력할 때 특히 유용합니다.
  • -about (선택 사항) 플래그는 라이선스 정보를 출력합니다

이 정보를 IDA Pro로 가져오려면 https://github.com/mandiant/GoReSym/blob/master/IDAPython/goresym_rename.py에 있는 스크립트를 실행하면 됩니다. 이 스크립트는 GoReSym이 생성한 json 파일을 읽고 IDA에서 심볼/레이블을 설정합니다.

버전 지원

Go 컴파일러와 런타임이 변경됨에 따라 내장된 메타데이터 구조도 변경되었습니다. GoReSym은 다음과 같은 Go 릴리스 및 메타데이터 조합을 지원합니다:

  • ARM64 𝒙 Intel x86/x64 𝒙 MACH-O/ELF/PE 𝒙 빅/리틀 엔디언의 모든 조합
  • pclntab 파싱: >= Go 1.2
  • moduledata 위치: >= Go 1.2
  • moduledata 타입 파싱: >= Go 1.5

타입을 추출하는 데 사용되는 moduledata 테이블은 Go 1.5 이전에는 존재하지 않으므로, 이 라이브러리는 매우 오래된 Go 버전에서 타입을 추출하는 것을 결코 지원하지 않을 것입니다.

이 라이브러리는 현재 1.2 이전, 1.2, 1.16, 1.18, 1.20의 pclntab 레이아웃을 처리합니다. pclntab 버전은 항상 Go 런타임 버전보다 작거나 같다는 점에 유의하십시오(예: Go 런타임 1.19는 1.18 pclntab 레이아웃을 사용합니다). 우리는 항상 최신 런타임 버전을 지원하는 것 을 목표로 합니다.

기여

GoReSym의 소스 코드 대부분은 업스트림 Go 컴파일러 소스 디렉터리 /internal에서 복사되었습니다. 이를 작동시키기 위해 소스를 약간 수정해야 했습니다. GoReSym에 기여하고 싶다면 이 가져오기 과정을 설명할 수 있도록 계속 읽어 주십시오.

Go 패키지가 작동하는 방식 때문에 소스 파일 트리에서 /internal 경로를 제거해야 했습니다. 그 결과 많은 내부 Go 파일을 복사하게 되었으며, 디렉터리 트리는 대부분 그대로 유지되지만 많은 파일의 import에 작은 변경이 가해졌습니다. /internal 경로에 대한 참조가 github.com/mandiant/GoReSym/로 대체되었습니다.

또한 많은 내부 구조체를 수정하여 필드와 메서드를 내보내도록 했습니다. 이들은 사용자가 의존해서는 안 되기 때문에 Go 업스트림에서는 내보내지 않습니다. 그러나 이 도구의 목적은 내부 정보를 추출하는 것이므로, 우리는 이러한 구조체를 유지 관리하는 작업을 맡고 있습니다. 좋은 상황은 아니지만 쉽게 피할 수 있는 것도 아닙니다. 이 저장소를 업데이트할 경우 이러한 수정 사항을 그대로 유지하도록 주의해야 합니다. 업스트림 파일을 통째로 복사하기보다는 업스트림의 커밋을 수동으로 병합하는 것이 아마 더 나을 것입니다.

일반적인 go build로도 컴파일되면서 이러한 문제를 피할 수 있도록 이 프로젝트를 더 잘 구성할 방법에 대한 제안을 환영합니다. Go 유지 관리자들이 참여한 이전 논의가 여기에 있습니다.

몇 가지 사소한 변경을 제외하면 대부분의 새로운 로직은 /objfile에 있습니다. 예를 들어 objfile/internals 파일은 GoReSym이 파싱하는 역방향 내부 Go 구조체를 정의합니다.

참고 문헌

  • pclntab 명세: golang.org/s/go12symtab
  • pclntab 매직: pclntab.go#L169
  • objfile 버그:
    • golang/go#42954
    • golang/go#47981
    • golang/go#47852
  • buildID 레거시 버그: golang/go#50809

변경 사항

  • 이전 1.2 레이아웃과의 호환성을 유지하면서 Go 1.24 바이너리에 대한 파싱 지원을 추가했습니다.
  • GoReSym은 이제 runtime_modulesinit 초기화 메서드의 시그니처를 기반으로 pclntab을 찾으려고 시도하며, pclntab 매직이 수정된 경우 이를 복구하려고 시도합니다.
  • objfile/<fileformat>의 pcln() 함수를 확장하여 pclntab 매직에 대한 바이트 스캔을 지원합니다.
  • /debug/<fileformat>의 파일 형식 파서에서 시그니처 스캔을 지원하기 위해 DataAfterSection과 같은 루틴을 추가했습니다.
  • 선택적 symtab 섹션이 비어 있을 때 조기에 종료하도록 debug/gosym/symtab.go의 walksymtab에 검사를 추가했습니다.
  • 많은 멤버와 내부 구조체를 내보냈습니다(변경 사항이 너무 많아 열거할 수 없음).
  • objfile/objfile.go의 PCLineTable()에서 goobj 라이너 지원을 제거했습니다.
  • 심볼이 존재하지만 악의적으로 수정되어 유효하지 않은 경우 패닉을 방지하기 위해 loadPeTable(및 기타 형식 변형) 주변에 추가적인 정합성 검사를 추가했습니다(참조: golang/go#47981).
  • 섹션 주소 및 오프셋과 같은 정보에 대한 더 낮은 수준의 접근을 제공하기 위해 일부 내부 함수의 시그니처를 수정했습니다.
  • 가상 주소로 파일 데이터를 읽기 위해 지원되는 파일 형식에 대한 read_memory 루틴을 구현했습니다.
  • 타입 및 인터페이스 검색(typelinks를 통해)을 지원하기 위해 moduledata를 찾는 데 도움을 주는 moduledata 스캔 루틴을 도입했습니다.
  • 유효하지 않은 심볼 테이블에 대한 크기 가드를 readStringTable에 추가했습니다. 파싱 실패도 무시됩니다.

라이선스

MIT

도구 다운로드